算法小知识-----8.14-----分割字符串的最大得分

77 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情

周六偷懒了,但是周日就必须要补回来,毕竟周日的晚上就是对周一的早上的衔接

分割字符串的最大得分

该题出自力扣的1422题 —— 分割字符串的最大得分【简单题】

审题

给你一个由若干 0 和 1 组成的字符串 s ,请你计算并返回将该字符串分割成两个 非空 子字符串(即 左 子字符串和 右 子字符串)所能获得的最大得分。

  • 「分割字符串的得分」为 左 子字符串中 0 的数量加上 右 子字符串中 1 的数量。
  • 该题题意并不难懂,就是给出一个字符串,需要根据字符串内的01数量,返回分割后的两边总和

    • 分割字符串,左边需要计算出0的数量,加上右边的1的数量
    • 需要留意的是,字符串内只存在0和1
  • 那么简单模拟的解决方案:

    • 利用一个变量,统计出1的数量
      • 遍历整个字符串,计算出1的数量,也因此可以得出0的数量
    • 利用另一变量,统计左边0 的个数
      • 遍历字符串,只需要遍历到倒数第一位即可
      • 如果 0 ,则变量 + 1,如果是1,则之前1的数量变量 -1
      • 因为左边的字符串,如果是0,则会对数量 +1;对于右边的字符串,如果是1,则会导致1转移到左边的字符串处,导致数量 - 1
      • 因此只需要判断当前最大值与 左边的0个数变量 + 右边的1所剩数量,哪个更大即可
  • 时间复杂度:O(n),其中 n 是字符串 s 的长度。需要遍历字符串两次。

编码

class Solution {
    public int maxScore(String s) {
        int num1 = 0,res = 0;
        for (int i = 0; i < s.length(); i++) {
            if(s.charAt(i) == '1'){
                num1++;
            }
        }
        int left0 = 0;
        for (int i = 0; i < s.length() - 1; i++) {
            if(s.charAt(i) == '0'){
                left0++;
            }else {
                num1--;
            }
            res = Math.max(res,left0 + num1);   
        }
        return res;
    }
}

image.png