携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第25天,点击查看活动详情
题目:LeetCode
在一个 平衡字符串 中,'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 <= 1000s[i] = 'L' 或 'R's是一个 平衡 字符串
解题思路
题目中给定的就是平衡字符串s, 又知道 一个平衡字符串中'L' 和 'R' 字符的数量是相同的。
- 分割平衡字符串,越短则可以得到越多,肯定使用贪心算法
- 遍历给定的字符串,过程中要记录‘L’和‘R’的数量,它俩数目相等即是一个平衡字符串
- 要记录‘L’和‘R’的数量则要定义2个变量,若记录它俩的差值,差值为0也表示数量相等,只需一个变量即可
代码实现
public int balancedStringSplit(String s) {
int ans = 0; // 记录平衡字符串数量
int diff = 0; // 记录'L'和'R'的差值,左减1,右加1,为0表示数量一样
for (int i = 0; i < s.length(); ++i) {
if (s.charAt(i) == 'L') {
--diff;
} else {
++diff;
}
if (diff == 0) {
++ans; // 平衡字符串数加1
}
}
return ans;
}
这里没做字符串判空处理,题中给定是平衡字符串,肯定是非空。平常开发中要加上
运行结果
复杂度分析
- 时间复杂度:
- 空间复杂度:
在掘金(JUEJIN) 一起分享知识, Keep Learning!