【题目】
在一个「平衡字符串」中,‘L’ 和 ‘R’ 字符的数量是相同的。
给出一个平衡字符串 s,请你将它分割成尽可能多的平衡字符串。
返回可以通过分割得到的平衡字符串的最大数量。
【示例 1】
输入:s = “RLRRLLRLRL”
输出:4
解释:s 可以分割为 “RL”, “RRLL”, “RL”, “RL”, 每个子字符串中都包含相同数量的 ‘L’ 和 ‘R’。
【示例 2】
输入:s = “RLLLLRRRLR”
输出:3
解释:s 可以分割为 “RL”, “LLLRRR”, “LR”, 每个子字符串中都包含相同数量的 ‘L’ 和 ‘R’。
【示例 3】
输入:s = “LLLLRRRR”
输出:1
解释:s 只能保持原样 “LLLLRRRR”.
【提示】
1 <= s.length <= 1000
s[i] = ‘L’ 或 ‘R’
分割得到的每个字符串都必须是平衡字符串。
【代码】
【C++】
【方法1】自己的憨憨方法
class Solution {
public:
int balancedStringSplit(string s) {
int cnt=0,c=0;
char first=s[0];
for(auto x:s){
if(x==first)
c++;
else
c--;
if(c==0)
cnt++;
}
return cnt;
}
};
【方法2】膜拜大佬的优秀思路
【思路】
题目是对两个字符进行操作,那么自然会考虑到字符的asc码
L和R的中间字符O,即L-O=-3;R-O=3,
原串就可以转化为3和-3的序列,这么看思路就很清晰了,
题目要求子串中ΣL=ΣR,并未要求L和R结构对称,再加上所有分割出的子串都必须为平衡串
那么其实就是求±3序列的前缀和为0的次数
class Solution {
public:
int balancedStringSplit(string s) {
int nums=0,ans=0;
for(auto i:s)ans+=((nums+=(i-'O'))==0);
return ans;
}
};
【Python】
class Solution:
def balancedStringSplit(self, s: str) -> int:
cnt=0
c=0
first=s[0]
for x in s:
if x==first:
c+=1
else:
c-=1
if c==0:
cnt+=1
return cnt