返回

力扣刷题 1221 分割平衡字符串:变换字符串增强韧性策略

前端

力扣刷题 1221 分割平衡字符串

题目

给你一个由若干字符 LR 构成的字符串 s,每个 L 要与之后的一个 R 配对。

如果存在这样的 i,使得 s[i] = 'L' ,且 j < is[j] = 'R' ,则认为这个 LR 配对。

返回 s 中剩下的 LR 不配对的数目。

示例 1:

输入:s = "LRLRLLRLRL"
输出:4
解释:s 中有 4 个 `L` 与 `R` 不配对,分别是第一个,第二个,第五个,和最后一个 L。

示例 2:

输入:s = "RLRLLRLRLR"
输出:2
解释:s 中有 2 个 `L` 与 `R` 不配对,分别是第一个,和最后一个 L。

示例 3:

输入:s = "LLRLLRLLRL"
输出:3
解释:s 中有 3 个 `L` 与 `R` 不配对,分别是第一个,第四个,和最后一个 L。

示例 4:

输入:s = "LRLRL"
输出:0
解释:s 中所有 `L` 与 `R` 都配对。

示例 5:

输入:s = "RLLLRLLRLL"
输出:2
解释:s 中有 2 个 `L` 与 `R` 不配对,分别是第一个,和最后一个 L。

解题思路

我们来思考一下,我们该如何解决这个问题。

首先,我们可以观察到,字符串 sL 的个数和 R 的个数是相等的。所以,我们可以先计算字符串 sL 的个数。

然后,我们可以遍历字符串 s,每次遇到一个 L,我们就将 L 的个数减一。

当我们遍历完整个字符串 s 后,我们可以得到字符串 s 中剩余 L 的个数。这个数目就是字符串 s 中剩余 LR 不配对的数目。

代码实现

def balancedStringSplit(s):
    """
    :type s: str
    :rtype: int
    """
    # 计算字符串 s 中 L 的个数
    count_l = 0
    for char in s:
        if char == 'L':
            count_l += 1

    # 遍历字符串 s,计算剩余 L 的个数
    count = 0
    count_l_remaining = count_l
    for char in s:
        if char == 'L':
            count_l_remaining -= 1
        else:
            count_l_remaining += 1

        if count_l_remaining == 0:
            count += 1

    return count

复杂度分析

  • 时间复杂度:O(n),其中 n 是字符串 s 的长度。
  • 空间复杂度:O(1)

总结

分割平衡字符串的算法题,通过对字符串的字符遍历操作和简单的数学运算,即可得到字符串中剩余不配对的 LR 的数目。