题目:696. 计数二进制子串
思路:记录连续的1和0的个数,在每次发生01转变的时候,来找出最多可以组合多少个符合要求的子字符串。细节看注释
class Solution {
public:
int countBinarySubstrings(string s) {
int ans=0;
//分别记录最新的连续0和1的个数
int s0=0,s1=0;
//flag=-1表示还没有出现01,flag=0表示当前前面的数是0,flag=1表示当前前面的数是1
int flag=-1;
for(auto x:s){
//当前字符是0时
if(x=='0'){
//前面的字符也是0,就++
if(flag==0) s0++;
else if(flag==-1){
//还没有出现01
s0=1;
flag=0;
}else{
//前面的数是1,说明要判断在此之前可以组合成多少个符合要求的字符串了
ans+=min(s0,s1);
s0=1;
flag=0;
}
}else{
//当前字符是1时
//前面的字符也是1,就++
if(flag==1) s1++;
else if(flag==-1){
//还没有出现01
s1=1;
flag=1;
}else{
//前面的数是0,说明要判断在此之前可以组合成多少个符合要求的字符串了
ans+=min(s0,s1);
s1=1;
flag=1;
}
}
//cout<<ans<<endl;
}
//最后还需统计一次,避免漏掉
ans+=min(s0,s1);
return ans;
}
};