问题描述
思路分析
1. 观察题目条件
- 字符串中的
'L'
和'R'
的数量是完全相等的。- 这意味着,整个字符串可以在某些位置被拆分成满足条件的子串。
- 每个子串中必须满足
'L'
的数量等于'R'
的数量。 - 我们的目标是找到最多的这样的子串。
2. 核心思路:平衡计数法
- 使用一个计数器
balance
来表示当前子串中'L'
和'R'
的相对数量。- 遍历字符串时:
- 遇到字符
'L'
,balance
加 1。 - 遇到字符
'R'
,balance
减 1。
- 遇到字符
- 当
balance == 0
时:- 当前子串是平衡的(因为
'L'
和'R'
的数量相等)。 - 增加计数
count
,表示找到一个平衡子串。
- 当前子串是平衡的(因为
- 遍历字符串时:
- 最终,
count
的值就是可以拆分的最多平衡子串数量。
3. 算法步骤
- 初始化:
balance = 0
:用于跟踪当前平衡状态。count = 0
:用于记录平衡子串的数量。
- 遍历字符串:
- 如果字符是
'L'
,增加balance
; - 如果字符是
'R'
,减少balance
; - 每次当
balance == 0
时,说明找到一个平衡子串,count
加 1。
- 如果字符是
- 返回
count
。
4. 总结
- 核心是维护一个计数器
balance
,它通过'L'
和'R'
的数量变化来判断是否找到一个平衡子串。 - 每次
balance
归零时,可以拆分一个子串,最终统计总数即可。
示例代码(Python)
from typing import List
def solution(s: str) -> int:
# 初始化计数器和平衡子串数量
balance = 0
count = 0
# 遍历字符串
for char in s:
# 如果是 'L',计数器加 1;如果是 'R',计数器减 1
if char == 'L':
balance += 1
elif char == 'R':
balance -= 1
# 如果计数器归零,说明找到一个平衡子串
if balance == 0:
count += 1
return count
if __name__ == '__main__':
print(solution(s='LRLLRRLLRRLLRR') == 4)
print(solution(s='RLRLRLRRRLLL') == 4)
print(solution(s='RRLLLRLRRL') == 4)
代码分析
1. 初始化变量
balance = 0 # 用于记录当前'L'和'R'的数量差
count = 0 # 用于统计平衡子串的数量
balance
是关键变量,它通过字符'L'
和'R'
的数量变化来判断当前子串是否平衡:- 遇到
'L'
,平衡值增加(balance += 1
)。 - 遇到
'R'
,平衡值减少(balance -= 1
)。
- 遇到
- 当
balance == 0
时,说明当前的'L'
和'R'
的数量相等,找到一个平衡子串。 count
用于统计总的平衡子串数。
2. 遍历字符串
for char in s:
if char == 'L':
balance += 1 # 遇到'L',平衡值增加
elif char == 'R':
balance -= 1 # 遇到'R',平衡值减少
- 遍历字符串
s
中的每个字符。 - 根据字符是
'L'
还是'R'
,更新balance
值:- 遇到
'L'
,说明当前子串中需要有更多的'R'
来达到平衡,因此增加balance
。 - 遇到
'R'
,说明当前子串中需要有更多的'L'
来达到平衡,因此减少balance
。
- 遇到
3. 判断平衡子串
if balance == 0:
count += 1 # 如果平衡值归零,说明找到一个平衡子串
- 每次当
balance == 0
时,意味着从上一个平衡点到当前字符之间的子串是平衡的(即'L'
和'R'
的数量相等)。 - 每次找到平衡子串时,将
count
增加 1。
4. 返回结果
return count
- 返回累计的平衡子串数量
count
。
示例运行过程
示例 1
输入:s = "LRLLRRLLRRLLRR"
- 初始:
balance = 0, count = 0
- 遍历字符:
L -> balance = 1
R -> balance = 0 -> count = 1
(找到平衡子串)L -> balance = 1
L -> balance = 2
R -> balance = 1
R -> balance = 0 -> count = 2
(找到平衡子串)L -> balance = 1
L -> balance = 2
R -> balance = 1
R -> balance = 0 -> count = 3
(找到平衡子串)L -> balance = 1
L -> balance = 2
R -> balance = 1
R -> balance = 0 -> count = 4
(找到平衡子串)
- 最终:
count = 4
输出:4
示例 2
输入:s = "RLRLRLRRRLLL"
- 初始:
balance = 0, count = 0
- 遍历字符:
R -> balance = -1
L -> balance = 0 -> count = 1
(找到平衡子串)R -> balance = -1
L -> balance = 0 -> count = 2
(找到平衡子串)R -> balance = -1
L -> balance = 0 -> count = 3
(找到平衡子串)R -> balance = -1
R -> balance = -2
L -> balance = -1
L -> balance = 0 -> count = 4
(找到平衡子串)
- 最终:
count = 4
输出:4