携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情
周六偷懒了,但是周日就必须要补回来,毕竟周日的晚上就是对周一的早上的衔接
分割字符串的最大得分
该题出自力扣的1422题 —— 分割字符串的最大得分【简单题】
审题
给你一个由若干 0 和 1 组成的字符串 s ,请你计算并返回将该字符串分割成两个 非空 子字符串(即 左 子字符串和 右 子字符串)所能获得的最大得分。
- 「分割字符串的得分」为 左 子字符串中 0 的数量加上 右 子字符串中 1 的数量。
-
该题题意并不难懂,就是给出一个字符串,需要根据字符串内的01数量,返回分割后的两边总和
- 分割字符串,左边需要计算出0的数量,加上右边的1的数量
- 需要留意的是,字符串内只存在0和1
-
那么简单模拟的解决方案:
- 利用一个变量,统计出1的数量
- 遍历整个字符串,计算出1的数量,也因此可以得出0的数量
- 利用另一变量,统计左边0 的个数
- 遍历字符串,只需要遍历到倒数第一位即可
- 如果 0 ,则变量 + 1,如果是1,则之前1的数量变量 -1
- 因为左边的字符串,如果是0,则会对数量 +1;对于右边的字符串,如果是1,则会导致1转移到左边的字符串处,导致数量 - 1
- 因此只需要判断当前最大值与 左边的0个数变量 + 右边的1所剩数量,哪个更大即可
- 利用一个变量,统计出1的数量
-
时间复杂度:O(n),其中 n 是字符串 s 的长度。需要遍历字符串两次。
编码
class Solution {
public int maxScore(String s) {
int num1 = 0,res = 0;
for (int i = 0; i < s.length(); i++) {
if(s.charAt(i) == '1'){
num1++;
}
}
int left0 = 0;
for (int i = 0; i < s.length() - 1; i++) {
if(s.charAt(i) == '0'){
left0++;
}else {
num1--;
}
res = Math.max(res,left0 + num1);
}
return res;
}
}