0%

『LeetCode』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' 组成。

标签

字符串


题解

【分割字符串的最大得分】简单模拟

模拟

枚举分割点统计即可

注意分割点不能是 0 和 n 两个位置,即左右字符串至少有一个字符

1
2
3
4
5
6
7
8
9
10
11
12
# Code language: Python
class Solution:
def maxScore(self, s: str) -> int:
left0, right1 = int(s[0] == '0'), s.count('1') - int(s[0] == '1')
ans = left0 + right1
for i in range(1, len(s) - 1):
if s[i] == '0':
left0 += 1
else:
right1 -= 1
ans = max(ans, left0 + right1)
return ans
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Code language: Java
class Solution {
public int maxScore(String s) {
int left = 0, right = 0, ans, n = s.length() - 1;
if (s.charAt(0) == '0') ++left;
for (int i = 1; i <= n; ++i)
if (s.charAt(i) == '1')
++right;
ans = left + right;
for (int i = 1; i < n; ++i) {
if (s.charAt(i) == '0') ++left;
else --right;
ans = Math.max(ans, left + right);
}
return ans;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Code language: C++
class Solution {
public:
int maxScore(string s) {
int left = 0, right = 0, ans, n = s.size() - 1;
if (s[0] == '0') ++left;
for (int i = 1; i <= n; ++i)
if (s[i] == '1')
++right;
ans = left + right;
for (int i = 1; i < n; ++i) {
if (s[i] == '0') ++left;
else --right;
ans = max(ans, left + right);
}
return ans;
}
};
  • 时间复杂度: \(O(n)\)
  • 空间复杂度: \(O(1)\)

如果对你有帮助的话,请给我点个赞吧~

欢迎前往 我的博客Algorithm - Github 查看更多题解

--- ♥ end ♥ ---

欢迎关注我呀~