编程语言
首页 > 编程语言> > 【LeetCode】C++ :简单题 - 字符串 696. 计数二进制子串

【LeetCode】C++ :简单题 - 字符串 696. 计数二进制子串

作者:互联网

696. 计数二进制子串

难度简单331

给定一个字符串 s,计算具有相同数量 0 和 1 的非空(连续)子字符串的数量,并且这些子字符串中的所有 0 和所有 1 都是连续的。

重复出现的子串要计算它们出现的次数。

 

示例 1 :

输入: "00110011"
输出: 6
解释: 有6个子串具有相同数量的连续1和0:“0011”,“01”,“1100”,“10”,“0011” 和 “01”。

请注意,一些重复出现的子串要计算它们出现的次数。

另外,“00110011”不是有效的子串,因为所有的0(和1)没有组合在一起。

示例 2 :

输入: "10101"
输出: 4
解释: 有4个子串:“10”,“01”,“10”,“01”,它们具有相同数量的连续1和0。

 

提示:

  • s.length 在1到50,000之间。
  • s 只包含“0”或“1”字符。

我没有想到,

这题的关键在于 min(count[i], count[i-1]),前一个相同数的长度,和当前相同数的长度比较。

但我有点好奇,为什么比较长度取最小的就可以得出具有相同数量的子字符串的数量了。这个思路是挺难的啊。

class Solution {
public:
    int countBinarySubstrings(string s) {
        vector<int> counts;
        int i = 0, len = s.length();
        while(i < len){
            char ch = s[i];
            int count = 0;
            while(i < len && s[i] == ch){
                i++;
                count++;
            }
            counts.push_back(count);
        }
        int res = 0;
        for(int i = 1; i < counts.size(); i++){
            res += min(counts[i], counts[i-1]);
        }
        return res;
    }
};

啊还可以优化

比较的是前一个相同数和当前相同数,因此,记录一下前一个数量就好了,last初值为0

class Solution {
public:
    int countBinarySubstrings(string s) {
        // vector<int> counts;
        int i = 0, len = s.length();
        int last = 0;
        int res = 0;
        while(i < len){
            char ch = s[i];
            int count = 0;
            while(i < len && s[i] == ch){
                i++;
                count++;
            }
            res += min(last, count);
            last = count;
        }
        return res;
    }
};

 

标签:count,子串,696,int,res,C++,len,counts,LeetCode
来源: https://blog.csdn.net/weixin_44566432/article/details/113461889