给你一个由若干 0 和 1 组成的字符串 s ,请你计算并返回将该字符串分割成两个 非空 子字符串(即 左 子字符串和 右 子字符串)所能获得的最大得分。
「分割字符串的得分」为 左 子字符串中 0 的数量加上 右 子字符串中 1 的数量。
解法一
暴力破解
class Solution {
public int maxScore(String s) {
char[] ch = s.toCharArray();
//最大得分
int max = 0;
//每次循环一轮后的得分
int count;
for (int i = 1; i < ch.length; i++) {
count = 0;
//遍历左子字符串
for (int j = 0; j < i; j++) {
if (ch[j] == '0') count++;
}
//遍历右子字符串
for (int j = i; j < ch.length; j++) {
if (ch[j] == '1') count++;
}
//比较max和count
if (count > max) max = count;
}
return max;
}
}
解法二
看题解后,按照其思路做出来的,先遍历一遍得到0的个数left,然后从后往前遍历再一次,如果为1,right加1,如果为0,left减1,每次循环运算后,比较最大得分,最后返回最大得分。
class Solution {
public int maxScore(String s) {
char[] ch = s.toCharArray();
//left为左边的得分(0的个数)
int left = 0;
for (char c : ch) {
if (c == '0') left++;
}
//max为最大得分
int max = 0;
//right为右边的得分(1的个数)
int right = 0;
//判断条件i不能等于0,因为如果等于0,相当于整个字符串都是右子串,所以需要留一位
for (int i = ch.length - 1; i > 0; i--) {
//如果当前值为1,那么right加1,而left因为得数是0,所以1时没损失
if (ch[i] == '1') right++;
//如果当前值为0,说明减去了一个left左边0的个数
else left--;
//比较最大得分
if (left + right > max) max = left + right;
}
return max;
}
}