难度简单211
平衡字符串 中,'L' 和 'R' 字符的数量是相同的。
给你一个平衡字符串 s,请你将它分割成尽可能多的子字符串,并满足:
- 每个子字符串都是平衡字符串。
返回可以通过分割得到的平衡字符串的 最大数量 。
示例 1:
输入:s = "RLRRLLRLRL"
输出:4
解释:s 可以分割为 "RL"、"RRLL"、"RL"、"RL" ,每个子字符串中都包含相同数量的 'L' 和 'R' 。示例 2:
输入:s = "RLRRRLLRLL"
输出:2
解释:s 可以分割为 "RL"、"RRRLLRLL",每个子字符串中都包含相同数量的 'L' 和 'R' 。
注意,s 无法分割为 "RL"、"RR"、"RL"、"LR"、"LL" 因为第 2 个和第 5 个子字符串不是平衡字符串。示例 3:
输入:s = "LLLLRRRR"
输出:1
解释:s 只能保持原样 "LLLLRRRR" 。提示:
2 <= s.length <= 1000s[i] = 'L' 或 'R's是一个 平衡 字符串
1、栈
看到这道题因为只有两个元素匹配,我就想到了用栈来解决问题,不难,但是要注意的是循环的时候要判断一下是否是否出界或者栈为空,具体的看下面代码:
class Solution {
public:
int balancedStringSplit(string s) {
stack<char> st;
st.push(s[0]);
int sum = 0;
int i = 1;
while(i < s.size())
{
bool flag = false;
while(i < s.size() && !st.empty() && s[i] != st.top())
{
st.pop();
i++;
if(st.empty())
flag = true;
}
if(flag)
sum++;
if(i < s.size())
{
if(st.empty() || s[i] == st.top())
st.push(s[i]);
i++;
}
}
return sum;
}
};2、计数法
看了题解发现其实有很多更好的解法,这里举这个方法也就是计数法:
class Solution {
public:
int balancedStringSplit(string s) {
int sum = 0;
int R = 0; // 记录'R'的次数
int L = 0; // 记录'L'的次数
for(size_t i = 0; i < s.size(); ++i)
{
if(s[i] == 'R')
R++;
else if(s[i] == 'L')
L++;
if(L == R) // 若两个次数相同则匹配了,则sum++
{
sum++;
L = R = 0;
}
}
return sum;
}
};