(66)696。バイナリ部分文字列のカウント(leetcode)

题目链接:
https://leetcode-cn.com/problems/count-binary-substrings/
难度:简单
696. 计数二进制子串
	给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,
	并且这些子字符串中的所有0和所有1都是组合在一起的。
	重复出现的子串要计算它们出现的次数。
示例 1 :
	输入: "00110011"
	输出: 6
	解释: 有6个子串具有相同数量的连续1和0:“0011”,“01”,“1100”,“10”,“0011” 和 “01”。
	请注意,一些重复出现的子串要计算它们出现的次数。
	另外,“00110011”不是有效的子串,因为所有的0(和1)没有组合在一起。


文字列0と1の数が同じであるのは0と1だけです。0
または1は連続している必要があります(たとえば、1100は正しく、1010は正しくありません)
。異なる位置にある同じ文字列も同じと見なされ

ます。
連続する同一文字の数を
ベクトルに格納し、ベクトルの隣接する数minを追加します

举个例子:
	字符串: 11100001100
	vector: 3 4 2 2
		min(3,4) + min(4,2)	+  min(2,2)=7
class Solution {
    
    
public:
    int countBinarySubstrings(string s) {
    
    
        vector<int> vec;
        int i=0;
        while(i<s.size()){
    
    
            auto a=s[i];
            int count=0;
            while(s[i]==a&&i<s.size()){
    
    
                i++;
                count++;
            }
            vec.push_back(count);
        }
        int ans=0;
        for(int i=0;i<vec.size()-1;++i){
    
    
            int n=min(vec.at(i),vec.at(i+1));
            ans+=n;
        }
        return ans;
    }
};

またint n=min(vec.at(i),vec.at(i+1));、センテンスベクトルを使用して、それが前のものにのみ関連していること示すこともできません。

class Solution {
    
    
public:
    int countBinarySubstrings(string s) {
    
    
        int i=0;
        int pre=0;
        int ans=0;
        while(i<s.size()){
    
    
            auto a=s[i];
            int count=0;
            while(s[i]==a&&i<s.size()){
    
    
                i++;
                count++;
            }
            ans+=min(pre,count);
            pre=count;
        }
        return ans;
    }
};

おすすめ

転載: blog.csdn.net/li_qw_er/article/details/107903565