天水网站建设公司排名网站asp模板
2026/5/21 13:40:27 网站建设 项目流程
天水网站建设公司排名,网站asp模板,sns社交网站注册,潍坊seo培训926. 将字符串翻转到单调递增 问题描述 如果一个二进制字符串的每个字符都满足#xff1a;0 在 1 之前#xff08;即形如 000...111...#xff09;#xff0c;则称该字符串为单调递增的。 给定一个二进制字符串 s#xff0c;你可以将其中的任意 0 翻转为 10在1之前即形如000...111...则称该字符串为单调递增的。给定一个二进制字符串s你可以将其中的任意0翻转为1或将1翻转为0。返回使s单调递增所需的最少翻转次数。示例输入: s 00110 输出: 1 解释: 翻转最后一位得到 00111。 输入: s 010110 输出: 2 解释: 翻转第二位和第五位得到 000111。 输入: s 00011000 输出: 2 解释: 翻转第五位和第六位得到 00000000。算法思路前缀和对于每个可能的分割位置i0 i n左边[0, i-1]应该全是0需要翻转的1数量 左边1的数量右边[i, n-1]应该全是1需要翻转的0数量 右边0的数量总翻转次数 左边1的数量 右边0的数量动态规划维护两个状态dp0以当前位置结尾且当前字符为0时的最少翻转次数dp1以当前位置结尾且当前字符为1时的最少翻转次数状态转移如果当前字符是0dp0不变dp1 min(dp0, dp1) 1如果当前字符是1dp0dp1 min(dp0, dp1)代码实现方法一前缀和classSolution{/** * 使用前缀和计算最少翻转次数 * * param s 二进制字符串 * return 使字符串单调递增的最少翻转次数 */publicintminFlipsMonoIncr(Strings){intns.length();// 计算前缀和prefixOnes[i] 表示 s[0...i-1] 中 1 的数量int[]prefixOnesnewint[n1];for(inti0;in;i){prefixOnes[i1]prefixOnes[i](s.charAt(i)1?1:0);}intminFlipsInteger.MAX_VALUE;// 枚举所有可能的分割点 i0 i n// 分割点 i 表示 [0, i-1] 为 0[i, n-1] 为 1for(inti0;in;i){// 左边 [0, i-1] 中 1 的数量需要翻转为 0intonesToLeftprefixOnes[i];// 右边 [i, n-1] 中 0 的数量需要翻转为 1intzerosToRight(n-i)-(prefixOnes[n]-prefixOnes[i]);minFlipsMath.min(minFlips,onesToLeftzerosToRight);}returnminFlips;}}方法二动态规划classSolution{/** * 动态规划 * * param s 二进制字符串 * return 使字符串单调递增的最少翻转次数 */publicintminFlipsMonoIncr(Strings){// dp0: 当前位置为 0 时的最少翻转次数// dp1: 当前位置为 1 时的最少翻转次数intdp00,dp10;for(charc:s.toCharArray()){if(c0){// 当前字符是 0// dp0 不变保持为 0不需要翻转// dp1 min(dp0, dp1) 1翻转为 1dp1Math.min(dp0,dp1)1;}else{// 当前字符是 1// dp0翻转为 0// dp1 min(dp0, dp1)保持为 1不需要翻转dp0;dp1Math.min(dp0,dp1);}}returnMath.min(dp0,dp1);}}算法分析方法时间复杂度空间复杂度前缀和O(n)O(n)动态规划O(n)O(1)算法过程输入s 010110方法一prefixOnes [0,0,1,1,2,3,3]枚举分割点i0: 左边’1’数0右边’0’数3 → 翻转3i1: 左边’1’数0右边’0’数2 → 翻转2i2: 左边’1’数1右边’0’数2 → 翻转3i3: 左边’1’数1右边’0’数1 → 翻转2i4: 左边’1’数2右边’0’数1 → 翻转3i5: 左边’1’数3右边’0’数1 → 翻转4i6: 左边’1’数3右边’0’数0 → 翻转3最小值 2方法二c0:dp00保持0dp11翻转为1→(0,1)c1:dp01翻转为0dp1min(0,1)0保持1→(1,0)c0:dp01保持0dp1min(1,0)11翻转为1→(1,1)c1:dp02翻转为0dp1min(1,1)1保持1→(2,1)c1:dp03翻转为0dp1min(2,1)1保持1→(3,1)c0:dp03保持0dp1min(3,1)12翻转为1→(3,2)结果min(3,2) 2测试用例publicstaticvoidmain(String[]args){SolutionsolutionnewSolution();// 测试用例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长字符串StringlongStr00000000000000000000000000000000000000000000000000;System.out.println(Test 11: solution.minFlipsMonoIncr(longStr));// 0}关键点分割点单调递增字符串必然存在一个分割点枚举所有可能的分割点是最直观的思路动态规划状态dp0和dp1分别表示以0和1结尾的最少翻转次数状态转移要考虑当前字符和之前的最优解边界情况处理全0或全1的情况单字符字符串空字符串常见问题为什么动态规划中dp1 min(dp0, dp1)单调递增允许1后面继续是1前面可以是以0或1结尾取较小值

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询