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’ 组成。
解题分析及思路:
本题直接遍历即可。
首先第一次遍历得到1
的个数,然后计算将s
从第一个分开,左边0
的个数和右边1
的个数。
one := 0
for i := 0; i < len(s); i++ {
if s[i] == '1' {
one++
}
}
var max int
if s[0] == '0' {
max = 1 + one
} else {
max = one - 1
}
第二次遍历,根据当前位置的元素来计算左边左边0
的个数和右边1
的个数,因为第一步已经得到了最初始时的个数之和。所以:
- 当前位置为0时,结果加一
- 否则,结果减一
temp := max
for i := 1; i < len(s)-1; i++ {
if s[i] == '0' {
temp++
} else {
temp--
}
if temp > max {
max = temp
}
}
复杂度:
- 时间复杂度:O(n)
- 空间复杂度:O(1)
执行结果:
- 执行用时:0 ms, 在所有 Go 提交中击败了100.00%的用户
- 内存消耗:1.8 MB, 在所有 Go 提交中击败了84.21%的用户
Tags :
通过次数 58.5K 提交次数 101.8K 通过率 57.5%