给定一个字符串
s
,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的。重复出现的子串要计算它们出现的次数。
示例 1 :
输入: "00110011" 输出: 6 解释: 有6个子串具有相同数量的连续1和0:“0011”,“01”,“1100”,“10”,“0011” 和 “01”。 请注意,一些重复出现的子串要计算它们出现的次数。 另外,“00110011”不是有效的子串,因为所有的0(和1)没有组合在一起。
解析:可以发现如果是0011的话会包含2个,即0011 01 ;如果是000111的话包含3个,即000111 0011 01 ;01的话只有一个。
也就是说有多少个重复的01即有多少个情况,
拿实例1来说 00110011 : 可以找出三组 0011 1100 0011,每组都有2个,也就是6个。
所以我们可以把字符串相邻的0,1个数统计出来 ,实例一可统计为: 2 2 2 2 ;相邻取比较小的那个值相加 为 2+2+2 = 6
再来一个例子 000110000111 : 统计每块儿的个数: 3 2 4 3 ;相邻较小数字相加:2+2+3 = 7
程序步骤:(1)开辟一个数组,统计连续的0或者1出现的次数(2)相邻次数取最小值
class Solution {
public:
int countBinarySubstrings(string s) {
if(s.size()<=1)
return 0;
vector<int> v;
int count = 1;
auto begin = s.begin();
auto end = s.end();
while(begin != end)
{
while(*begin == *(begin+1))
{
++count;
++begin;
}
++begin;
v.push_back(count);
count = 1;
}
int ret = 0;
for(size_t i = 0;i<v.size();++i)
{
if(i+1<v.size())
ret += min(v[i],v[i+1]);
}
return ret;
}
};