字符串:连续对称二进制子串

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


猜你喜欢

转载自blog.csdn.net/xiezongsheng1990/article/details/80233516
今日推荐