给一个字符串s,计算具有相同数字0和1的非空(连续)子字符串的数量,并且这些子字符串中的全部0和全部1被连续分组。子串发生多次被计数的次数。

217 篇文章 0 订阅
174 篇文章 2 订阅

本题源自leetcode  696

-----------------------------------------------------------------------------

思考:

代码:

int countBinarySubstrings(string s) {
        /*
        vector<int> rec;
        int count = 1;
        int n = s.length();
        for(int i = 1; i <= n; i++){
            if(s[i] == s[i-1])
                count++;
            else{
                rec.push_back(count);
                count = 1;
            }
        }
        int res = 0;
        for(int i = 1; i < rec.size(); i++){
            res += min(rec[i],rec[i-1]);
        }
        return res;
        */
        int n = s.length();
        int res = 0;
        int cur = 1;
        int pre = 0;
        for(int i = 1; i < n; i++){
            if(s[i] == s[i-1])
                cur++;
            else{
                pre = cur;
                cur = 1;
            }
            if(pre >= cur)
                res++;
        }
        return res;
    }


对于一个由若干 0 和 1 组成的字符串 s ,我们可以将其分割成两个非空字符串,即左字符串和右字符串。每个字符串的得分为其的 1 的个数。我们的目标是找到一种分割方式,使得左字符串和右字符串的得分之和最大。 我们可以使用动态规划来解决这个问题。假设字符串 s 的长度为 n 。我们定义两个数组 left 和 right,其 left[i] 表示 s 的前 i 个字符(包括第 i 个字符) 1 的个数,right[i] 表示 s 的后 n-i 个字符(包括第 n-i 个字符) 1 的个数。 首先,我们可以先计算 left 数组。从左到右遍历字符串 s ,如果当前字符是 '1' ,则 left[i] = left[i-1] + 1 ,否则 left[i] = left[i-1] 。 接下来,我们可以计算 right 数组。从右到左遍历字符串 s ,如果当前字符是 '1' ,则 right[i] = right[i+1] + 1 ,否则 right[i] = right[i+1] 。 然后,我们遍历分割点 i (1 ≤ i ≤ n-1),计算字符串和右字符串的得分之和。得分之和即为 left[i] + right[i+1] 。 最后,我们找到得分之和的最大值,即为所求的最大得分。 以下是使用 Python 实现的代码: ```python def maxScore(s): n = len(s) left = [0] * n right = [0] * n # 计算 left 数组 left[0] = int(s[0]) for i in range(1, n): left[i] = left[i-1] + int(s[i]) # 计算 right 数组 right[n-1] = int(s[n-1]) for i in range(n-2, -1, -1): right[i] = right[i+1] + int(s[i]) max_score = 0 for i in range(n-1): score = left[i] + right[i+1] max_score = max(max_score, score) return max_score ``` 你可以调用该函数,并传入一个由 0 和 1 组成的字符串 s ,来计算并返回最大得分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值