【题目】
给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的。
重复出现的子串要计算它们出现的次数。
示例 :
输入: "00110011"
输出:
解释: 有个子串具有相同数量的连续和:“”,“”,“”,“”,“” 和 “”。
请注意,一些重复出现的子串要计算它们出现的次数。
另外,“”不是有效的子串,因为所有的(和)没有组合在一起。
示例 :
输入: "10101"
输出:
解释: 有个子串:“”,“”,“”,“”,它们具有相同数量的连续和。
注意:
s.length 在1到50,000之间。 s 只包含“0”或“1”字符。
【思路】
使用count0存储连续'0'的个数,count1存储连续'1'的个数,当前后字符不相同是,结果res加上count0和count1的较小值,并且改变计数。
【代码】
python版本
class Solution(object):
def countBinarySubstrings(self, s):
"""
:type s: str
:rtype: int
"""
res =
count0 =
count1 =
if len(s) < :
return
if s[] == '1':
count1 +=
else:
count0 +=
# 遍历s,s[i]和s[i-1]相同,则累加;不同,则将min(count0, count1)加入res
for i in range(, len(s)):
if s[i] == '1':
if s[i-1] == '1':
count1 +=
else:
res += min(count0, count1)
count1 =
else:
if s[i-1] == '0':
count0 +=
else:
res += min(count0, count1)
count0 =
res += min(count0, count1)
return res
C++版本
class Solution {
public:
int countBinarySubstrings(string s) {
int count0 = , count1 = ;
int res = ;
if(s.size() < )
return ;
if(s[] == '1')
count1++;
else
count0++;
for(int i=; i<s.size(); i++){
if(s[i] == '1'){
if(s[i-1] == '1')
count1++;
else{
res += min(count0, count1);
count1 = ;
}
}else{
if(s[i-1] == '0')
count0++;
else{
res += min(count0, count1);
count0 = ;
}
}
}
res += min(count0, count1);
return res;
}
};