【3.7】贪心算法-解分割平衡字符串

一、题目

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

示例 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。

三、代码实现

cpp 复制代码
#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;
}
相关推荐
HXhlx25 分钟前
CART决策树基本原理
算法·机器学习
Wect1 小时前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
颜酱2 小时前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法
肆忆_4 小时前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
不想写代码的星星8 小时前
虚函数表:C++ 多态背后的那个男人
c++
Gorway8 小时前
解析残差网络 (ResNet)
算法
拖拉斯旋风8 小时前
LeetCode 经典算法题解析:优先队列与广度优先搜索的巧妙应用
算法
Wect8 小时前
LeetCode 207. 课程表:两种解法(BFS+DFS)详细解析
前端·算法·typescript
灵感__idea1 天前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
Wect1 天前
LeetCode 130. 被围绕的区域:两种解法详解(BFS/DFS)
前端·算法·typescript