小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
题目描述
在一个 平衡字符串 中,
'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. 数量比较
- 比较
L
和R
的数量 - 若
L
数量等于R
且都不为0
,那么找到了一个平衡字符串,将其纳入总数。 - 数量置零,重新寻找
const balancedStringSplit = s => {
let res = 0;
let [numL, numR] = [0, 0];
const len = s.length;
for (let i = 0; i < len; i++) {
if (s[i] === 'L') {
numL++;
} else {
numR++;
}
if (numL && numL === numR) {
res++;
numL = 0;
numR = 0;
}
}
return res;
};
2. 差值比较
- 维护一个差值
d
即计算L
和R
的差值 - 若
d
为0
,则说明L
和R
数量相等,那么找到了一个平衡字符串,将其纳入总数 - 继续寻找
const balancedStringSplit = s => {
let [res, d] = [0, 0];
const len = s.length;
for (let i = 0; i < len; i++) {
d = s[i] === 'L' ? d + 1 : d - 1;
!d && res++;
}
return res;
};
3. 栈解法
var balancedStringSplit = function(s) {
let stack = new Array();
let count = 0;
let len = s.length;
let l = "L", r = "R";
for (let i = 0; i < len; i++){
if (stack.length == 0){
stack.push(s[i]);
count++;
} else if (stack.includes(l) && s[i] == r){
stack.pop();
} else if (stack.includes(r) && s[i] == l){
stack.pop();
} else {
stack.push(s[i]);
}
}
return count;
};
感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。
写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤