开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第30天,点击查看活动详情
1221. 分割平衡字符串
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/sp…
在一个 平衡字符串 中,'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".
示例 4:
输入:s = "RLRRRLLRLL"
输出:2
解释:s 可以分割为 "RL"、"RRRLLRLL" ,每个子字符串中都包含相同数量的 'L' 和 'R' 。
提示:
- 1 <= s.length <= 1000
- s[i] = 'L' 或 'R'
- s 是一个 平衡 字符串
解法
这道题目看起来好像很复杂,其实是非常简单的贪心问题 从前向后遍历,只要遇到平衡子串,计数就+1,遍历一遍即可。
- 局部最优:从前向后遍历,只要遇到平衡子串 就统计
- 全局最优:统计了最多的平衡子串。
- 局部最优可以推出全局最优,举不出反例,那么就试试贪心。
贪心题目的思考过程是: 如果发现局部最优好像可以推出全局最优,那么就 尝试一下举反例,如果举不出反例,那么就试试贪心。 例如,LRLR 这本身就是平衡子串 , 但要遇到LR就可以分割。
- python
class Solution:
def balancedStringSplit(self, s: str) -> int:
res = 0
lcount = 0
rcount = 0
for i in range(len(s)):
if s[i] == 'L':
lcount += 1
if s[i] == 'R':
rcount += 1
if lcount == rcount:
res += 1
return res
- c
int balancedStringSplit(char * s){
int ans = 0, d = 0; // 用d省略一个变量,L: d++ R: d-- d==0时候ans+=1
for(int i=0; s[i]; i++)
{
s[i] == 'L' ? d++ : d--;
if(d==0)
{
ans += 1;
}
}
return ans;
}
- c++
class Solution {
public:
int balancedStringSplit(string s) {
int n = s.size();
int ans = 0;
int lcount = 0;
int rcount = 0;
for(int i=0; i<n; i++)
{
if(s[i]=='L')
{
lcount += 1;
}
else
{
rcount += 1;
}
if(lcount == rcount)
{
ans += 1;
}
}
return ans;
}
};
复杂度分析
- 时间复杂度:
- 空间复杂度: