【字符串】1221. 分割平衡字符串(值得学习)

【题目】
在一个「平衡字符串」中,‘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”.
【提示】
1 <= s.length <= 1000
s[i] = ‘L’ 或 ‘R’
分割得到的每个字符串都必须是平衡字符串。
【代码】
【C++】
【方法1】自己的憨憨方法

class Solution {
public:
    int balancedStringSplit(string s) {
        int cnt=0,c=0;
        char first=s[0];
        for(auto x:s){
            if(x==first)
                c++;
            else
                c--;
            if(c==0)
                cnt++;
        }
        return cnt;
    }
};

【方法2】膜拜大佬的优秀思路
【思路】
题目是对两个字符进行操作,那么自然会考虑到字符的asc码
L和R的中间字符O,即L-O=-3;R-O=3,
原串就可以转化为3和-3的序列,这么看思路就很清晰了,
题目要求子串中ΣL=ΣR,并未要求L和R结构对称,再加上所有分割出的子串都必须为平衡串
那么其实就是求±3序列的前缀和为0的次数

class Solution {
public:
    int balancedStringSplit(string s) {
        int nums=0,ans=0;
        for(auto i:s)ans+=((nums+=(i-'O'))==0);
        return ans;
    }
};

【Python】

class Solution:
    def balancedStringSplit(self, s: str) -> int:
        cnt=0
        c=0
        first=s[0]
        for x in s:
            if x==first:
                c+=1
            else:
                c-=1
            if c==0:
                cnt+=1
        return cnt
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值