题目描述
给你一个由若干 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'
组成。
解法
方法一:计数
我们用两个变量 $l$ 和 $r$ 分别记录左子字符串中 $0$ 的数量和右子字符串中 $1$ 的数量。初始时 $l = 0$,而 $r$ 则等于字符串 $s$ 中 $1$ 的数量。
遍历字符串 $s$ 的前 $n - 1$ 个字符,对于每一个位置 $i$,如果 $s[i] = 0$,则 $l$ 自增 $1$,否则 $r$ 自减 $1$。然后我们更新答案为 $l + r$ 的最大值。
时间复杂度 $O(n)$,其中 $n$ 为字符串 $s$ 的长度。空间复杂度 $O(1)$。
| class Solution:
def maxScore(self, s: str) -> int:
l, r = 0, s.count("1")
ans = 0
for x in s[:-1]:
l += int(x) ^ 1
r -= int(x)
ans = max(ans, l + r)
return ans
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | class Solution {
public int maxScore(String s) {
int l = 0, r = 0;
int n = s.length();
for (int i = 0; i < n; ++i) {
if (s.charAt(i) == '1') {
++r;
}
}
int ans = 0;
for (int i = 0; i < n - 1; ++i) {
l += (s.charAt(i) - '0') ^ 1;
r -= s.charAt(i) - '0';
ans = Math.max(ans, l + r);
}
return ans;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13 | class Solution {
public:
int maxScore(string s) {
int l = 0, r = count(s.begin(), s.end(), '1');
int ans = 0;
for (int i = 0; i < s.size() - 1; ++i) {
l += (s[i] - '0') ^ 1;
r -= s[i] - '0';
ans = max(ans, l + r);
}
return ans;
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12 | func maxScore(s string) (ans int) {
l, r := 0, strings.Count(s, "1")
for _, c := range s[:len(s)-1] {
if c == '0' {
l++
} else {
r--
}
ans = max(ans, l+r)
}
return
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | function maxScore(s: string): number {
let [l, r] = [0, 0];
for (const c of s) {
r += c === '1' ? 1 : 0;
}
let ans = 0;
for (let i = 0; i < s.length - 1; ++i) {
if (s[i] === '0') {
++l;
} else {
--r;
}
ans = Math.max(ans, l + r);
}
return ans;
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | impl Solution {
pub fn max_score(s: String) -> i32 {
let mut l = 0;
let mut r = s.bytes().filter(|&b| b == b'1').count() as i32;
let mut ans = 0;
let cs = s.as_bytes();
for i in 0..s.len() - 1 {
l += ((cs[i] - b'0') ^ 1) as i32;
r -= (cs[i] - b'0') as i32;
ans = ans.max(l + r);
}
ans
}
}
|