分割字符串的最大得分c
给你一个由若干 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' 组成。
#define MAX(a, b) ((b) > (a) ? (b) : (a)) int maxScore(char* s) { int n=strlen(s); int score=0; if(s[0]=='0') score++;//判断首元素是否为零 for(int i=1;i<n;i++) { score+=s[i]-'0';左0数组有一个元素,求最大得分 } int ans=score;存储最大得分方便比较 for(int j=1;j<n-1;j++)//计算接下来的得分是否大于ans { if(s[j]=='0') score++; else score--; ans=MAX(score,ans);比较存储最大得分} return ans; }
该题是用遍历的做法求,先求左0得分组为一位时的最大得分。用ans存储此时得分,方便接下来的比较。同样的从s【1】出发开始左0数组向右移动,若为零score++,否则score--,
核心是score,score是要求的最大得分,所以对score进行操作,不断与一开始球的最大得分进行比较,并更新ans。
需要注意的是:左0数组最大只能在n-1,因为要求非空,所以1<i<n,0<j<n-1但由于一开始if判断所以第二个for循环用1;
方法二:枚举每个分割点
`for (int i = 1; i < n; i++) {
int score = 0;
for (int j = 0; j < i; j++) {
if (s[j] == '0') {//枚举每个的精髓
score++;
}
}
for (int j = i; j < n; j++) {
if (s[j] == '1') {
score++;
}
}
ans = MAX(ans, score);
}、
不同的地方就是不是两次遍历,而是一次遍历
一开始我的思想:创立左0得分数组和右1得分数组,然后首先先判断左0数组的第一个元素是否为0,不为零l++;左零数组个数慢慢增加,右1数组没有左零数组的元素,然后计算得分。缺点是每计算一次得分不知道怎么和下几次得分比较。思路没有打开。

浙公网安备 33010602011771号