一、题目
在一个 平衡字符串 中, 'L'和'R'字符的数量是相同的 。给你一个平衡字符串s,请你将它分割成尽可能多的平衡字符串。
注意:分割得到的每个字符串都必须是平衡字符串。返回可以通过分割得到的平衡字符 串的 最大数量 。
示例 1:
输入:s = "RLRRL LRLRL "
输出:4
解释:s 可以分割为 "RL "、"RRL L "、"RL "、"RL " ,每个子字符串中都包含相同数量的
' L ' 和 'R' 。
示例 2:
输入:s = "RL L L LRRRLR"
输出:3
解释: s 可 以 分 割 为 "RL " 、 " L L LRRR" 、 " LR" , 每 个 子 字 符 串 中 都 包 含 相 同 数 量 的 ' L '
和 'R' 。
示例 3:
输入:s = " L L L LRRRR"
输出:1
解释:s 只能保持原样 " L L L LRRRR".
示例 4:
输入:s = "RLRRRL LRL L "
输出:2
解 释 : s 可 以 分 割 为 "RL " 、 "RRRL LRL L " , 每 个 子 字 符 串 中 都 包 含 相 同 数 量 的 ' L ' 和
'R' 。
提示:
1)1 <= s.length <= 1000
2)s [i] = ' L ' 或 'R'
3)s 是一个平衡字符串
二、解题思路
平衡字符串的定义是字符串中L和R的数量相等。题目明确指出字符串s仅包含L和R两种字符。因此,一种直接的解题方法是使用两个计数器分别统计L和R的出现次数。每当这两个计数器相等时,就意味着我们发现了一个平衡字符串。我们需要记录这些相等的次数,即平衡字符串的数量。
以示例1为例,对于输入字符串 "RLRRLLRLRL",执行思路如下:
-
初始状态:
count = 0
,left = 0
,right = 0
-
遍历字符串 "RLRRLLRLRL":
-
'R':
left = 0
,right = 1
-
'L':
left = 1
,right = 1
(平衡,count = 1
) -
'R':
left = 1
,right = 2
-
'R':
left = 1
,right = 3
-
'L':
left = 2
,right = 3
-
'L':
left = 3
,right = 3
(平衡,count = 2
) -
'R':
left = 3
,right = 4
-
'L':
left = 4
,right = 4
(平衡,count = 3
) -
'R':
left = 4
,right = 5
-
'L':
left = 5
,right = 5
(平衡,count = 4
)
-
最终,count
的值为4,即平衡字符串的数量为4。
三、代码实现
cpp
#include <iostream>
#include <string>
int balancedStringSplit(const std::string& s) {
int count = 0; // 平衡字符串的数量
int left = 0; // 字符L的数量
int right = 0; // 字符R的数量
for (char ch : s) {
// 统计L和R的数量
if (ch == 'L') {
left++;
} else {
right++;
}
// 如果L和R的数量相等,说明截取的子串是平衡字符串
if (left == right) {
count++;
}
}
return count;
}
int main() {
std::string s = "RLRRLLRLRL";
int result = balancedStringSplit(s);
std::cout << "Number of balanced string splits: " << result << std::endl;
return 0;
}