给定一个字符串 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。
思路:刚开始暴力遍历,然后超出时间限制,就去网上找解决办法
这个先使用一个集合存储1和0的个数
比如:00110011
则在集合表示为:2,2,2,2
接下来计算个数,,在集合里相邻则意味着0和1或1和0,而题目所要求的是两个交界处,比如01111111,即使再多的1,符合要求的也只有01,再例如,00000000011,存在01,0011,答案取决于个数少的那个字符。
class Solution {
public int countBinarySubstrings(String s) {
int result=0;
List<Integer>list=new ArrayList<Integer>();
for(int i=0;i<s.length();)
{
char flag=s.charAt(i);
int count=1;
while(i+count<s.length()&&s.charAt(i+count)==flag)
count++;
i=i+count;
list.add(count);
}
for(int i=0;i<list.size()-1;i++)
{
result+=Math.min(list.get(i),list.get(i+1));
}
return result;
}
}