(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不是 )
位置不同 字串相同也算

一开始没仔细读题 md。。。
将连续的相同的字符个数存入vector中
根据vector中相邻的个数 取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;
    }
};

也可以不使用vector 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
今日推荐