1422 分割字符串的最大得分(模拟)

1. 问题描述:

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

「分割字符串的得分」为 左 子字符串中 0 的数量加上 右 子字符串中 1 的数量。

示例 1:

输入:s = "011101"
输出:5 
解释:
将字符串 s 划分为两个非空子字符串的可行方案有:
左子字符串 = "0" 且 右子字符串 = "11101",得分 = 1 + 4 = 5 
左子字符串 = "01" 且 右子字符串 = "1101",得分 = 1 + 3 = 4 
左子字符串 = "011" 且 右子字符串 = "101",得分 = 1 + 2 = 3 
左子字符串 = "0111" 且 右子字符串 = "01",得分 = 1 + 1 = 2 
左子字符串 = "01110" 且 右子字符串 = "1",得分 = 2 + 1 = 3
示例 2:

输入:s = "00111"
输出:5
解释:当 左子字符串 = "00" 且 右子字符串 = "111" 时,我们得到最大得分 = 2 + 3 = 5
示例 3:

输入:s = "1111"
输出:3

提示:

2 <= s.length <= 500
字符串 s 仅由字符 '0' 和 '1' 组成。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-score-after-splitting-a-string

2. 思路分析:

① 题目不难理解,我们只需要模拟整个过程即可,首先需要计算出字符串第二个字符到末尾的1的数目,然后判断字符串的第一个字母是0还是1来计算出字母0的数目,所以通过1次的for循环我们可以知道第一个字母与第二个字母到末尾的0与1对应的数目总和,可以使用两个变量来记录0与1的字母变化,可以使用另外一个for循环来模拟分割字符串的过程,这个for循环从字符串的第二个字母开始,分别判断是0还是1来确定是否更新当前分割的字符串的0与1的数目,根据当前的0与1的数目与历史的最大值来确定是否更新最大值,这样使用两个for循环就可以模拟整个的字符串的分割过程

② 需要注意的是左边界最多到字符串的长度减1的位置

3. 代码如下:

class Solution {
    public int maxScore(String s) {
        if (s == null || s.equals("")) return 0;
        int zero = 0, one = 0;
        for (int i = 1; i < s.length(); ++i){
            int n = s.charAt(i) - '0';
            if (n == 1) ++one;
        }
        if (s.charAt(0) == '0') ++zero;
        int res = zero + one;
        /*注意应该是字符串的长度减去1*/
        for (int i = 1; i < s.length() - 1; ++i){
            int n = s.charAt(i) - '0';
            if (n == 0) ++zero;
            if (n == 1) --one;
            res = Math.max(res, zero + one);
        }
        if (zero == s.length() || one == s.length()) return s.length() - 1;
        return res;
    }
}

 

你可能感兴趣的:(领扣)