【力扣刷题】1221. 分割平衡字符串

418 阅读1分钟

「这是我参与11月更文挑战的第 20 天,活动详情查看:2021最后一次更文挑战

原题链接

1221. 分割平衡字符串 - 力扣(LeetCode) (leetcode-cn.com)

题目描述

在一个 平衡字符串 中,'L' 和 'R' 字符的数量是相同的。

给你一个平衡字符串 s,请你将它分割成尽可能多的平衡字符串。

注意:分割得到的每个字符串都必须是平衡字符串,且分割得到的平衡字符串是原平衡字符串的连续子串。

返回可以通过分割得到的平衡字符串的 最大数量

测试用例

示例 1:

输入:s = "RLRRLLRLRL"
输出:4
解释:s 可以分割为 "RL""RRLL""RL""RL" ,每个子字符串中都包含相同数量的 'L''R'

示例 2:

输入:s = "RLLLLRRRLR"
输出:3
解释:s 可以分割为 "RL""LLLRRR""LR" ,每个子字符串中都包含相同数量的 'L''R'

参数限制

  • 1 <= s.length <= 1000
  • s[i] = 'L' 或 'R'
  • s 是一个 平衡 字符串

分析

一个字符串中包含有数量相等的 L, R 两种字符,需要我们尽可能的来切割为多个子字符,并满足子字符串中的 L, R 数量相等

最简单的思路就是,从头开始遍历这个字符串,记录 L, R 的字符数量,当他们相等时,清空字符计数,并使他们的子字符计数 +1

上面的思路,我们需要两个字符计数器,countL, countR 然后单独计数再清空,略微繁琐,我们可以优化为一个总的计数器 count:当字符为 L 时, count++;字符为 R 时,count--;当 count 的计数为 0 时,子字符串计数 +1

代码

var balancedStringSplit = function(s) {
    let count = 0,
        sum = 0;
    s.split('').forEach(n => {
        count = count+(n=='L'?1:-1);
        if(count==0){
            sum++;
        }
    })
    return sum;
};

image.png

复杂度分析

  • 时间复杂度:O(n),其中 n 是字符串 s 的长度。我们仅需遍历 s 一次。

  • 空间复杂度:O(1)。只需要常数的空间存放若干变量。


今天的力扣刷题就分享到这里,感谢大家的阅读~