美文网首页
子串——找出所有包含的排列(三)

子串——找出所有包含的排列(三)

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

    LeetCode_438_FindAllAnagramsInAString

    题目分析:

    上一题只找一个,这题找所有。双指针的思路不变,只是中途不return而已。
    同时注意 s: "abab" p: "ab" 这个用例,不要找到一个串就跳过整个串。
    

    解法:

    public static List<Integer> findAnagrams(String s, String p) {
        List<Integer> res = new LinkedList<>();
        if (s.isEmpty()) return res;
        int[] m = new int[128];
        int left = 0, right = 0, cnt = p.length(), n = s.length();
        for (char c : p.toCharArray()) ++m[c];
        while (right < n) {
            if (m[s.charAt(right++)]-- > 0) --cnt;
            if (cnt == 0) res.add(left);
            /**
             * 利用了惰性判断 right - left == p.length() 不成立时
             * 右边不会执行,left也就不会递增。
             */
            if (right - left == p.length() && m[s.charAt(left++)]++ >= 0) ++cnt;
        }
        return res;
    }
    

    相关文章

      网友评论

          本文标题:子串——找出所有包含的排列(三)

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