[toc] leetcode 1221. 分割平衡字符串.
题目描述
- 分割平衡字符串
平衡字符串 中,'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 <= 1000 s[i] = 'L' 或 'R' s 是一个 平衡 字符串
解题思路
法1
双指针:
-
维护两个指针,分别指向子字符串的开始位置与结束位置,
-
维护一个变量用于判断子字符串是否为平衡字符串(子字符串出现r就减1出现l就加1,如果count==0,即为平衡字符串)
-
当判断为平衡字符串,开始位置移动到结束位置,开启新的判断,
-
循环遍历整个数组,记录平衡字符串的个数,输出结果
- 时间复杂度(O(n))
- 空间复杂度(O(1))
执行结果
法1
func balancedStringSplit(s string)(r int) {
//两个指针,分别指向向子串的开始与结束位置
for i,j,count:=0,0,0;j<len(s);{
if i!=j&&count==0{//记录平衡子字符串个数
i=j
r++
}else{//不满足条件,继续遍历
if s[j]=='R'{
count--
}else{
count++
}
j++
}
}
//最后一位一定满足,因为平衡子串的数量一定为双数
r++
return
}
执行结果: 通过 显示详情 查看示例代码 添加备注
执行用时: 0 ms , 在所有 Go 提交中击败了 100.00% 的用户 内存消耗: 1.8 MB , 在所有 Go 提交中击败了 100.00% 的用户 通过测试用例: 40 / 40 炫耀一下:
本文由mdnice多平台发布