给定一个由“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; }