豆包MarsCode:字符串对比问题

问题描述

在这里插入图片描述


思路分析

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"

  1. 初始:balance = 0, count = 0
  2. 遍历字符:
    • 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(找到平衡子串)
  3. 最终:count = 4

输出:4

示例 2

输入:s = "RLRLRLRRRLLL"

  1. 初始:balance = 0, count = 0
  2. 遍历字符:
    • 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(找到平衡子串)
  3. 最终:count = 4

输出:4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凭君语未可

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值