题目:
给定一个字符串 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”字符。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-binary-substrings
思路:
将连续的字符,分成一段一段的来看,比如:00110011 ,分成 00 , 11 , 00 , 11 ,其长度分别为 2 ,2,2,2 。
则其 重复出现的子串出现的次数 result = sum (所有连续两段中可重复出现的子串数)
Java代码如下:
class Solution {
public int countBinarySubstrings(String s) {
Set<Character> set = new HashSet<>(); // 用于存放已经出现的字符
List<Integer> countList = new ArrayList<>();
int count = 0; // 标记每段连续出现的 0 或者 1 字符串的长度
for(int i=0;i<s.length();i++){
if(i==0){
set.add(s.charAt(i)); //第一个字符放进set集合中
count++;
}else {
if(set.contains(s.charAt(i))){
count++; //连续字符出现的次数
}else {
// 连续字符的结尾
countList.add(count);
count=0;
set.remove(s.charAt(i-1)); //移除出现过的字符,为下一次做准备
set.add(s.charAt(i));
count++;
}
}
if(i==s.length()-1){
countList.add(count); //记录最后一个字符连续出现的次数出现
}
}
int result = 0;
for (int i=0;i<countList.size()-1;i++){
result+= Math.min(countList.get(i),countList.get(i+1));
}
return result;
}
}