「这是我参与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 <= 1000s[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;
};
复杂度分析
-
时间复杂度:O(n),其中 n 是字符串 s 的长度。我们仅需遍历 s 一次。
-
空间复杂度:O(1)。只需要常数的空间存放若干变量。
今天的力扣刷题就分享到这里,感谢大家的阅读~