LeetCode分割字符串的最大得分使用JavaScript解题,击败了100%的用户|前端学算法

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情

有人相爱,有人夜里开车看海,我是leetcode第一题都做不出来

虽然这几天做的都是简单的题,但是做出来就可以提升自信,今天自信又提升了一大截,因为我秒杀了100%的JavaScript用户

分割字符串的最大得分

给你一个由若干 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
};
复制代码

image.png

一定还有更简便的算法,说不定能彻底击败所有用户,开搞开搞

image.png

猜你喜欢

转载自juejin.im/post/7131740322287058957