一、题目
示例 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。
三、代码实现
#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;
}