夯实算法-15.分割平衡字符串

199 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第25天,点击查看活动详情

题目:LeetCode

在一个 平衡字符串 中,'L' 和 'R' 字符的数量是相同的。
给你一个平衡字符串 s,请你将它分割成尽可能多的平衡字符串。
注意:分割得到的每个字符串都必须是平衡字符串,且分割得到的平衡字符串是原平衡字符串的连续子串。
返回可以通过分割得到的平衡字符串的 最大数量 。

示例 1:

输入:s = "RLRRLLRLRL"
输出:4
解释:s 可以分割为 "RL""RRLL""RL""RL" ,每个子字符串中都包含相同数量的 'L''R'

示例 2:

输入:s = "RLLLLRRRLR"
输出:3
解释:s 可以分割为 "RL""LLLRRR""LR" ,每个子字符串中都包含相同数量的 'L''R'

示例 3:

输入: s = "LLLLRRRR"
输出: 1
解释: s 只能保持原样 "LLLLRRRR".

示例 4:

输入:s = "RLRRRLLRLL"
输出:2
解释:s 可以分割为 "RL""RRRLLRLL" ,每个子字符串中都包含相同数量的 'L''R'

提示:

  • 1 <= s.length <= 1000
  • s[i] = 'L' 或 'R'
  • s 是一个 平衡 字符串

解题思路

题目中给定的就是平衡字符串s, 又知道 一个平衡字符串中'L' 和 'R' 字符的数量是相同的。

  • 分割平衡字符串,越短则可以得到越多,肯定使用贪心算法
  • 遍历给定的字符串,过程中要记录‘L’和‘R’的数量,它俩数目相等即是一个平衡字符串
  • 要记录‘L’和‘R’的数量则要定义2个变量,若记录它俩的差值,差值为0也表示数量相等,只需一个变量即可

代码实现

public int balancedStringSplit(String s) {
    int ans = 0;   // 记录平衡字符串数量
    int diff = 0;  // 记录'L'和'R'的差值,左减1,右加1,为0表示数量一样
    for (int i = 0; i < s.length(); ++i) {
        if (s.charAt(i) == 'L') {
            --diff;
        } else {
            ++diff;
        }
        if (diff == 0) {
            ++ans;   // 平衡字符串数加1
        }
    }
    return ans;
}

这里没做字符串判空处理,题中给定是平衡字符串,肯定是非空。平常开发中要加上

运行结果

Snipaste_2022-08-24_15-31-33.png

复杂度分析

  • 时间复杂度:O(n)O(n)
  • 空间复杂度:O(1)O(1)

掘金(JUEJIN)  一起分享知识, Keep Learning!