美文网首页
子串——是否包含排列(二)

子串——是否包含排列(二)

作者: 旺叔叔 | 来源:发表于2018-11-22 16:15 被阅读0次

    LeetCode_567_PermutationInString

    题目分析:

    双指针,这个方法也是这个系列的核心方法,之后的题大都使用了这个思想。
    用一个cnt记录遍历到的在s中的字符个数。
    0 == cnt表示两个指针包含的字符串中,已经找到了s的所有字符。
    此刻长度如果等于s,那么找到了。
    如果不等于s,那么中间有多余的字母,左边指针往右走,直到0 != cnt。
    PS:可以用m[26],当然也可以改成m[128],多常数级的空间,但是少做很多次减法。
    你可以分别尝试一下这m[26]和m[128]在leetcode上的效率排名。
    

    解法:

    public static boolean checkInclusion(String s1, String s2) {
        int cnt = s1.length(), left = 0;
        int[] m = new int[128];
        for (char c : s1.toCharArray()) ++m[c];
        for (int right = 0; right < s2.length(); ++right) {
            if (m[s2.charAt(right)]-- > 0) --cnt;
            while (0 == cnt) {
                if (right - left + 1 == s1.length()) return true;
                if (++m[s2.charAt(left++)] > 0) ++cnt;
            }
        }
        return false;
    }

    相关文章

      网友评论

          本文标题:子串——是否包含排列(二)

          本文链接:https://www.haomeiwen.com/subject/chilqqtx.html