分割字符串的最大得分
给你一个由若干 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
解题思路
最简单的方式就是我们可以先把字符串s
分成两个字符串,然后各自计算得分,把每种情况罗列出来,最后比较一下最大的分数;但是这样计算量比较大,需要至少三个循环来完成,而且写起来也很麻烦。
于是我就按照自己的想法写了一个,没想到用时击败了100%的JavaScript用户
字符串的中0和1个数都是固定的,比如'1'来说,左边字符串多了一个,右边字符串必定要少一个,所以我们可以先求出来字符串s
里面到底有多少个'1';先遍历一下字符串s
计算一下一共有几个'1',然后再遍历一遍字符串s
,如果s[i]是'0'那么左字符串加一分,如果是'1'则右字符串减一分,加一块就是现在两个字符串的得分,最后返回最大的分
以下步骤简洁明了:
- 第一步:定义三个变量,maxScore表示最大的分数,leftScore是左字符串中'0'的个数得分,rightScore是右字符串中'1'的个数得分,开始先遍历一下字符串s,算出rightScore得分
- 第二步:再一次遍历字符串
s
判断当前值是否是'0',如果是则leftScore加一分;如果不是则rightScore减一分;比较maxScore与leftScore+rightScore的值,并把大的赋值给maxScore - 第三步:最后返回maxScore
var maxScore = function(s) { let maxScore = 0 let leftScore = 0 let rightScore = 0 for(let i = 0;i<s.length;i++){ if(s[i]==='1'){ rightScore++ } } for(let i = 0;i<s.length-1;i++){ if(s[i]==='0'){ leftScore++ }else{ rightScore-- } maxScore = Math.max(maxScore,leftScore+rightScore) } return maxScore };