开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情
LeetCode1221:分割平衡字符串
平衡字符串 中,'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是一个 平衡 字符串
思路分析
通过题目描述,知道一个平衡字符串中 L 和 R 的数量是相等的,而且,如果这个字符串可以分割成两个平衡字符串,说明分割的两半中 L 和 R 的数量也是相等的,所以,可以从左到右边遍历一遍,遇到 L 和 R 的数量相等的时候就把它分割出去,这样可以保证分割出来尽可能多的子字符串。
以 s = "RLLLLRRRLR" 为例,用贪心来做这道题, 维护 L 和 R 的数量两个变量,从左到右遍历一遍,当两者相等的时候结果加1即可。
算法代码
public int balancedStringSplit(String s) {
int ans = 0;
int lcount = 0;
int rcount = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == 'L') {
lcount++;
} else {
rcount++;
}
if (lcount == rcount) {
ans++;
}
}
return ans;
}
结果
算法复杂度
- 时间复杂度:
- 空间复杂度:
在掘金(JUEJIN)一起进步,一起成长!