题目
给定一个字符串 s
,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的。
重复出现的子串要计算它们出现的次数。
示例 1 :
输入: "00110011" 输出: 6 解释: 有6个子串具有相同数量的连续1和0:“0011”,“01”,“1100”,“10”,“0011” 和 “01”。 请注意,一些重复出现的子串要计算它们出现的次数。 另外,“00110011”不是有效的子串,因为所有的0(和1)没有组合在一起。
示例 2 :
输入: "10101" 输出: 4 解释: 有4个子串:“10”,“01”,“10”,“01”,它们具有相同数量的连续1和0。
注意:
s.length
在1到50,000之间。s
只包含“0”或“1”字符。
分析
可以发现如果是0011的话会包含2个,即0011 01 ;如果是000111的话包含3个,即000111 0011 01 ;01的话只有一个。
也就是说有多少个重复的01即有多少个情况,
拿实例1来说 00110011 : 可以找出三组 0011 1100 00011,每组都有2个,也就是6个。
所以我们可以把字符串相邻的0,1个数统计出来 ,实例一可统计为: 2 2 2 ;相邻取比较小的那个值相加 为 2+2+2 = 6
再来一个例子 000110000111 : 统计每块儿的个数: 3 2 4 3 ;相邻较小数字相加:2+2+3 = 7
代码
class Solution {
public int countBinarySubstrings(String s) {
int result = 0;
List<Integer> list = new ArrayList<>();
int index = 0;
char temp = s.charAt(0);
list.add(1);
for (int i = 1; i < s.length(); i++) {
if (s.charAt(i) == temp){
list.set(index,list.get(index)+1);
}else {
list.add(1);
index++;
temp = s.charAt(i);
}
}
for (int i = 0; i < list.size() - 1; i++) {
result += Math.min(list.get(i),list.get(i+1));
}
return result;
}
}