给定一个由“0”和“1”组成的字符串,计算其中包含相同个数的0和1,且相同数字毗邻的子串个数。如字符串“00110011”,满足要求的子串有:01,10,01,0011,1100,0011,共6个。对于字符串“10101”,满足要求的子串有:10,01,10,01,共4个。
方法一:找到所有的“01”和“10”,再计算两边连续的“0”和“1”的个数,然后计算满足要求的子串个数。
public int countBinarySubstrings(String s) {
int count = 0;
List<Integer> list0 = find(s, "01");
List<Integer> list1 = find(s, "10");
for(int index : list0) {
int l0 = 0, l1 = 0;
while(index - l0 >= 0) {
if(s.charAt(index - l0) == '0') l0++;
else break;
}
while(index + l1 + 1 < s.length()) {
if(s.charAt(index + l1 + 1) == '1') l1++;
else break;
}
count += Math.min(l0, l1);
}
for(int index : list1) {
int l0 = 0, l1 = 0;
while(index - l1 >= 0) {
if(s.charAt(index - l1) == '1') l1++;
else break;
}
while(index + l0 + 1 < s.length()) {
if(s.charAt(index + l0 + 1) == '0') l0++;
else break;
}
count += Math.min(l0, l1);
}
return count;
}
public List<Integer> find(String s, String p){
List<Integer> list = new ArrayList<>();
int offset = 0;
while(s.indexOf(p, offset) != -1) {
list.add(s.indexOf(p, offset));
offset = s.indexOf(p, offset) + 1;
}
return list;
}
方法二:大神解法,膜拜一下
public int countBinarySubstrings(String s) {
int prevRunLength = 0, curRunLength = 1, res = 0;
for (int i=1;i<s.length();i++) {
if (s.charAt(i) == s.charAt(i-1)) curRunLength++;
else {
prevRunLength = curRunLength;
curRunLength = 1;
}
if (prevRunLength >= curRunLength) res++; //prevRunLength:前面连续的0(或1)的个数,curRunLength当前连续的1(或0)的个数;如果prevRunLength>curRunLength,则说明前面有足够的0(或1)与其对应,总个数+1;
}
return res;
}