算法题 将字符串翻转到单调递增

926. 将字符串翻转到单调递增

问题描述

如果一个二进制字符串的每个字符都满足:'0''1'之前(即形如"000...111..."),则称该字符串为单调递增的。

给定一个二进制字符串s,你可以将其中的任意'0'翻转为'1',或将'1'翻转为'0'

返回使s单调递增所需的最少翻转次数

示例

输入: s = "00110" 输出: 1 解释: 翻转最后一位得到 "00111"。 输入: s = "010110" 输出: 2 解释: 翻转第二位和第五位得到 "000111"。 输入: s = "00011000" 输出: 2 解释: 翻转第五位和第六位得到 "00000000"。

算法思路

  1. 前缀和:对于每个可能的分割位置i0 <= i <= n):

    • 左边[0, i-1]应该全是'0',需要翻转的'1'数量 = 左边'1'的数量
    • 右边[i, n-1]应该全是'1',需要翻转的'0'数量 = 右边'0'的数量
    • 总翻转次数 = 左边'1'的数量 + 右边'0'的数量
  2. 动态规划:维护两个状态:

    • dp0:以当前位置结尾,且当前字符为'0'时的最少翻转次数
    • dp1:以当前位置结尾,且当前字符为'1'时的最少翻转次数
    • 状态转移:
      • 如果当前字符是'0'dp0不变,dp1 = min(dp0, dp1) + 1
      • 如果当前字符是'1'dp0++dp1 = min(dp0, dp1)

代码实现

方法一:前缀和

classSolution{/** * 使用前缀和计算最少翻转次数 * * @param s 二进制字符串 * @return 使字符串单调递增的最少翻转次数 */publicintminFlipsMonoIncr(Strings){intn=s.length();// 计算前缀和:prefixOnes[i] 表示 s[0...i-1] 中 '1' 的数量int[]prefixOnes=newint[n+1];for(inti=0;i<n;i++){prefixOnes[i+1]=prefixOnes[i]+(s.charAt(i)=='1'?1:0);}intminFlips=Integer.MAX_VALUE;// 枚举所有可能的分割点 i(0 <= i <= n)// 分割点 i 表示 [0, i-1] 为 '0',[i, n-1] 为 '1'for(inti=0;i<=n;i++){// 左边 [0, i-1] 中 '1' 的数量(需要翻转为 '0')intonesToLeft=prefixOnes[i];// 右边 [i, n-1] 中 '0' 的数量(需要翻转为 '1')intzerosToRight=(n-i)-(prefixOnes[n]-prefixOnes[i]);minFlips=Math.min(minFlips,onesToLeft+zerosToRight);}returnminFlips;}}

方法二:动态规划

classSolution{/** * 动态规划 * * @param s 二进制字符串 * @return 使字符串单调递增的最少翻转次数 */publicintminFlipsMonoIncr(Strings){// dp0: 当前位置为 '0' 时的最少翻转次数// dp1: 当前位置为 '1' 时的最少翻转次数intdp0=0,dp1=0;for(charc:s.toCharArray()){if(c=='0'){// 当前字符是 '0'// dp0 不变(保持为 '0',不需要翻转)// dp1 = min(dp0, dp1) + 1(翻转为 '1')dp1=Math.min(dp0,dp1)+1;}else{// 当前字符是 '1'// dp0++(翻转为 '0')// dp1 = min(dp0, dp1)(保持为 '1',不需要翻转)dp0++;dp1=Math.min(dp0,dp1);}}returnMath.min(dp0,dp1);}}

算法分析

方法时间复杂度空间复杂度
前缀和O(n)O(n)
动态规划O(n)O(1)

算法过程

输入:s = "010110"

方法一

  1. prefixOnes = [0,0,1,1,2,3,3]
  2. 枚举分割点:
    • i=0: 左边’1’数=0,右边’0’数=3 → 翻转=3
    • i=1: 左边’1’数=0,右边’0’数=2 → 翻转=2
    • i=2: 左边’1’数=1,右边’0’数=2 → 翻转=3
    • i=3: 左边’1’数=1,右边’0’数=1 → 翻转=2
    • i=4: 左边’1’数=2,右边’0’数=1 → 翻转=3
    • i=5: 左边’1’数=3,右边’0’数=1 → 翻转=4
    • i=6: 左边’1’数=3,右边’0’数=0 → 翻转=3
  3. 最小值 = 2

方法二

  1. c='0':dp0=0(保持0),dp1=1(翻转为1)→(0,1)
  2. c='1':dp0=1(翻转为0),dp1=min(0,1)=0(保持1)→(1,0)
  3. c='0':dp0=1(保持0),dp1=min(1,0)+1=1(翻转为1)→(1,1)
  4. c='1':dp0=2(翻转为0),dp1=min(1,1)=1(保持1)→(2,1)
  5. c='1':dp0=3(翻转为0),dp1=min(2,1)=1(保持1)→(3,1)
  6. c='0':dp0=3(保持0),dp1=min(3,1)+1=2(翻转为1)→(3,2)
  7. 结果:min(3,2) = 2

测试用例

publicstaticvoidmain(String[]args){Solutionsolution=newSolution();// 测试用例1:标准示例System.out.println("Test 1: "+solution.minFlipsMonoIncr("00110"));// 1// 测试用例2:另一个标准示例System.out.println("Test 2: "+solution.minFlipsMonoIncr("010110"));// 2// 测试用例3:复杂情况System.out.println("Test 3: "+solution.minFlipsMonoIncr("00011000"));// 2// 测试用例4:全0System.out.println("Test 4: "+solution.minFlipsMonoIncr("0000"));// 0// 测试用例5:全1System.out.println("Test 5: "+solution.minFlipsMonoIncr("1111"));// 0// 测试用例6:交替System.out.println("Test 6: "+solution.minFlipsMonoIncr("010101"));// 3// 测试用例7:单字符System.out.println("Test 7: "+solution.minFlipsMonoIncr("0"));// 0System.out.println("Test 8: "+solution.minFlipsMonoIncr("1"));// 0// 测试用例8:需要全翻转为0System.out.println("Test 9: "+solution.minFlipsMonoIncr("1111100000"));// 5// 测试用例9:需要全翻转为1System.out.println("Test 10: "+solution.minFlipsMonoIncr("0000011111"));// 0// 测试用例10:长字符串StringlongStr="00000000000000000000000000000000000000000000000000";System.out.println("Test 11: "+solution.minFlipsMonoIncr(longStr));// 0}

关键点

  1. 分割点

    • 单调递增字符串必然存在一个分割点
    • 枚举所有可能的分割点是最直观的思路
  2. 动态规划状态

    • dp0dp1分别表示以'0''1'结尾的最少翻转次数
    • 状态转移要考虑当前字符和之前的最优解
  3. 边界情况处理

    • '0'或全'1'的情况
    • 单字符字符串
    • 空字符串

常见问题

  1. 为什么动态规划中dp1 = min(dp0, dp1)
    • 单调递增允许'1'后面继续是'1'
    • 前面可以是以'0''1'结尾,取较小值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1154507.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新手必看的HBuilderX安装教程:超详细版配置指南

HBuilderX安装与配置实战指南&#xff1a;新手从零到开发的完整路径 你是不是刚接触前端开发&#xff0c;面对五花八门的编辑器无从下手&#xff1f; 你是不是下载了HBuilderX却打不开&#xff0c;弹出“缺少VCRUNTIME140.dll”一脸懵&#xff1f; 又或者&#xff0c;你点开…

Nodejs和vue框架的基于智能推荐的卫生健康系统的设计与实现

文章目录摘要--nodejs技术栈--结论源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 随着信息技术的快速发展&#xff0c;智能推荐系统在卫生健康领域的应用日益广泛。本研究基于Node.js和Vue框架&#xff0c;设计并实现了一套智能推…

通义千问2.5-0.5B优化技巧:让边缘设备推理速度提升3倍

通义千问2.5-0.5B优化技巧&#xff1a;让边缘设备推理速度提升3倍 在AI模型日益庞大的今天&#xff0c;Qwen2.5-0.5B-Instruct 的出现为边缘计算带来了新的可能性。作为阿里通义千问 Qwen2.5 系列中最小的指令微调模型&#xff0c;它仅拥有约 5亿参数&#xff08;0.49B&#x…

5分钟部署Qwen2.5-0.5B:零基础搭建法律问答机器人实战

5分钟部署Qwen2.5-0.5B&#xff1a;零基础搭建法律问答机器人实战 1. 项目背景与目标 随着大语言模型&#xff08;LLM&#xff09;技术的快速发展&#xff0c;越来越多的企业和开发者希望将AI能力快速集成到垂直领域应用中。然而&#xff0c;从零训练一个大模型成本极高&…

HunyuanVideo-Foley创新应用:游戏过场动画音效自动生成探索

HunyuanVideo-Foley创新应用&#xff1a;游戏过场动画音效自动生成探索 1. 引言&#xff1a;AI音效生成的技术新范式 随着游戏工业对沉浸感要求的不断提升&#xff0c;高质量的音效设计已成为提升玩家体验的关键环节。传统音效制作依赖专业音频工程师手动匹配动作与声音&…

吐血推荐自考必用TOP10 AI论文平台测评

吐血推荐自考必用TOP10 AI论文平台测评 2026年自考论文写作工具测评&#xff1a;为何需要一份权威榜单&#xff1f; 随着自考人数逐年增长&#xff0c;论文写作成为众多考生必须面对的挑战。从选题构思到资料搜集&#xff0c;再到内容撰写与格式规范&#xff0c;每一步都可能成…

Nodejs和vue框架的基于的书城阅读器系统的设计与实现

文章目录摘要--nodejs技术栈--结论源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 该系统基于Node.js和Vue.js框架&#xff0c;设计并实现了一个功能完善的在线书城阅读器平台。Node.js作为后端服务器&#xff0c;提供高性能的异步…

UDS服务在车载网络架构中的部署完整指南

UDS服务在车载网络中的实战部署&#xff1a;从协议到工程落地当诊断不再是“读码清故障”——现代汽车为何离不开UDS&#xff1f;你有没有遇到过这样的场景&#xff1a;一辆智能电动车需要远程升级ADAS系统&#xff0c;工程师却卡在固件刷写前的安全认证环节&#xff1f;或者产…

从零实现:基于SPICE的二极管钳位电路动态行为仿真

从零实现&#xff1a;基于SPICE的二极管钳位电路动态行为仿真钳位不是“稳压”——你真的懂二极管在瞬态下的表现吗&#xff1f;在设计一个高速ADC输入前端&#xff0c;或是调试一条IC通信总线时&#xff0c;我们常习惯性地在信号线上加一对二极管&#xff0c;把电压“钳”在VD…

动态打码技术演进:从传统方法到AI解决方案

动态打码技术演进&#xff1a;从传统方法到AI解决方案 1. 技术背景与隐私保护的演进需求 在数字内容爆炸式增长的今天&#xff0c;图像和视频中的人脸信息已成为敏感数据的重要组成部分。无论是社交媒体分享、监控系统记录&#xff0c;还是企业宣传素材发布&#xff0c;人脸隐…

基于AI手势识别的远程控制方案:生产环境部署实战

基于AI手势识别的远程控制方案&#xff1a;生产环境部署实战 1. 引言&#xff1a;从交互革命到工业落地 1.1 手势识别的技术演进与现实挑战 随着人机交互方式的不断演进&#xff0c;传统按键、触控和语音指令已难以满足复杂场景下的操作需求。特别是在智能制造、医疗手术辅助…

从零实现Keil5下载到PLC仿真系统的完整示例

从零开始&#xff1a;用Keil5把PLC逻辑“烧”进STM32的实战全记录你有没有过这样的经历&#xff1f;写好了代码&#xff0c;点了“Download”&#xff0c;结果弹出一行红字&#xff1a;“Cannot access target.”调试器明明插着&#xff0c;线也没接错&#xff0c;板子也供电了…

【Conda】Conda更换国内镜像源

Conda更换国内镜像源引言一、配置 Conda 使用国内镜像源&#xff08;关键&#xff01;&#xff09;方法&#xff1a;修改 .condarc 配置文件&#xff08;推荐&#xff09;1. 打开或创建配置文件2. 粘贴以下 **优化后的清华源配置**&#xff08;已实测加速显著&#xff09;&…

GLM-4.6V-Flash-WEB实战对比:网页与API推理性能全面评测

GLM-4.6V-Flash-WEB实战对比&#xff1a;网页与API推理性能全面评测 智谱最新开源&#xff0c;视觉大模型。 1. 引言&#xff1a;为何需要评估GLM-4.6V-Flash的双重推理模式&#xff1f; 随着多模态大模型在图文理解、视觉问答&#xff08;VQA&#xff09;、图像描述生成等场景…

维纶触摸屏程序实际项目,威纶通界面UI,复制可用,威伦通触摸EB Pro6.00以上版本均可用...

维纶触摸屏程序实际项目&#xff0c;威纶通界面UI&#xff0c;复制可用&#xff0c;威伦通触摸EB Pro6.00以上版本均可用&#xff0c;ip和ie系列4.3寸7寸10寸均复制可用电子档项目里用维纶通触摸屏做HMI开发&#xff0c;最头疼的就是不同尺寸屏幕适配和控件复用。最近在工业现场…

MediaPipe Hands实战:AR应用中的手势交互实现

MediaPipe Hands实战&#xff1a;AR应用中的手势交互实现 1. 引言&#xff1a;AI 手势识别与追踪在AR中的价值 随着增强现实&#xff08;AR&#xff09;和人机交互技术的快速发展&#xff0c;基于视觉的手势识别正成为下一代自然交互方式的核心。传统触摸屏或语音控制存在场景…

pgsql_tmp文件夹体积快速增加

文章目录环境症状问题原因解决方案环境 系统平台&#xff1a;N/A 版本&#xff1a;4.1.1 症状 /xxx/data/base/pgsql_tmp 该文件夹下&#xff0c;临时文件数量及体积快速增加。重启数据库会使临时文件被删除&#xff0c;一段时间后临时文件再次出现爆满的情况。 问题原因 …

VibeVoice-TTS镜像免配置部署:JupyterLab一键启动实操手册

VibeVoice-TTS镜像免配置部署&#xff1a;JupyterLab一键启动实操手册 1. 引言 随着大模型在语音合成领域的持续突破&#xff0c;高质量、长文本、多说话人对话式语音生成正成为AI应用的新热点。传统TTS系统在处理超过几分钟的音频或涉及多个角色对话时&#xff0c;常面临语音…

JVET-AI0084

一、ALF 的原有问题&#xff08;ECM-13.0 中存在的问题&#xff09; 1. APS-ALF 系数跨帧复用但缺乏自适应能力 在 ECM-13.0 中&#xff1a;非固定 APS-ALF 的滤波系数&#xff1a; 由编码器针对某一帧优化可被后续多帧复用解码端对所有使用该 APS 的帧&#xff1a; 以相同强度…

小白也能玩转机器翻译:手把手教你用HY-MT1.5-1.8B

小白也能玩转机器翻译&#xff1a;手把手教你用HY-MT1.5-1.8B 1. 引言&#xff1a;为什么你需要一个本地部署的翻译模型&#xff1f; 在全球化协作日益频繁的今天&#xff0c;高质量、低延迟的机器翻译已成为开发者、内容创作者乃至普通用户的核心需求。虽然市面上有 Google …