这道题我一看到就想要用dp做,但没思路,看了题解才发现这么简单。
因为要找出的是0和1数量相同的子串,可以发现,相邻的0和1串能构成min(count0,count1)个符合要求的子串。比如00011,就能构成min(3,2)=2个符合要求的子串“0011”和“01”。
遍历整个串,记录每一段0和1的数量,如“000110100111”的计数就是[3,2,1,1,2,3],然后将该数组中每一对相邻的数去最小值累加到结果中。
class Solution {
public:
int countBinarySubstrings(string s) {
vector<int> count;
int m=s.length();
if(m<=1) return 0;
int pre=s[0],index=0;
count.push_back(1);
for(int i=1;i<m;i++)
{
if(s[i]==pre) count[index]+=1;
else {
count.push_back(1);
index++;
pre=s[i];
}
}
int res=0;
for(int i=1;i<index+1;i++)
{
res+=min(count[i],count[i-1]);
}
return res;
}
};