文章目录
- 1422. 分割字符串的最大得分
- 解题思路
- Go代码
1422. 分割字符串的最大得分
1422. 分割字符串的最大得分
给你一个由若干 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'
组成。
解题思路
通过示例3可知,必须把字符串且为左右两份,而不能不切
以第一个位置作为切分点,得到右边所有1
的个数rightScore
,然后依次以下一个位置作为切分点,如果是0
,则leftScore++
,如果是1
,则rightScore--
,因为当前的1
切分到左边去了
Go代码
func maxScore(s string) int {// 通过示例3可知,必须把字符串且为左右两份,而不能不切// 思路:以第一个位置作为切分点,得到右边所有1的个数rightScore,然后依次以下一个位置作为切分点,如果是1,则rightScore--,因为当前的1切分到左边去了if len(s) <= 1 {return 0}leftScore,rightScore := 0,0if s[0] == '0' {// 假设以第一个位置作为切分点leftScore = 1}for i := 1; i < len(s);i++ {//计算右边1的个数,即右边的得分if s[i] == '1' {rightScore++}}res := leftScore + rightScore// 以第一个字符作为切分点的总得分// 依次以后面的每个位置作为切分点,更新总得分,注:这里是len(s) - 1,因为最后一个切分点是倒数第一个位置for i := 1; i < len(s) - 1; i++ {if s[i] == '0' {leftScore++} else {// 此时该位置的1被切分到了左边,所以右边分数减1rightScore--}if res < leftScore + rightScore {//更新最大得分res = leftScore + rightScore}}return res
}