LeetCode: 1221. 分割平衡字符串

550 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第30天,点击查看活动详情

1221. 分割平衡字符串

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/sp…

在一个 平衡字符串 中,'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 是一个 平衡 字符串

解法

这道题目看起来好像很复杂,其实是非常简单的贪心问题 从前向后遍历,只要遇到平衡子串,计数就+1,遍历一遍即可。

  • 局部最优:从前向后遍历,只要遇到平衡子串 就统计
  • 全局最优:统计了最多的平衡子串。
  • 局部最优可以推出全局最优,举不出反例,那么就试试贪心。

贪心题目的思考过程是: 如果发现局部最优好像可以推出全局最优,那么就 尝试一下举反例,如果举不出反例,那么就试试贪心。 例如,LRLR 这本身就是平衡子串 , 但要遇到LR就可以分割。

  • python
class Solution:
    def balancedStringSplit(self, s: str) -> int:
        res = 0
        lcount = 0
        rcount = 0
        for i in range(len(s)):
            if s[i] == 'L':
                lcount += 1
            if s[i] == 'R':
                rcount += 1
            if lcount == rcount:
                res += 1
        return res
  • c
int balancedStringSplit(char * s){
    int ans = 0, d = 0;  // 用d省略一个变量,L: d++  R: d-- d==0时候ans+=1 
    for(int i=0; s[i]; i++)
    {
        s[i] == 'L' ? d++ : d--;
        if(d==0)
        {
            ans += 1;
        }
    }
    return ans;
}
  • c++
class Solution {
public:
    int balancedStringSplit(string s) {
        int n = s.size();
        int ans = 0;
        int lcount = 0;
        int rcount = 0;
        for(int i=0; i<n; i++)
        {
            if(s[i]=='L')
            {
                lcount += 1;
            }
            else
            {
                rcount += 1;
            }

            if(lcount == rcount)
            {
                ans += 1;
            }
        }
        return ans;

    }
};

复杂度分析

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