Leetcode 438 找到字符串中所有字母异位词

题目

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

解题思路

  在字符串 s 上维护一个窗口,窗口的大小与字符串 p 的长度一样,我们需要维护窗口内每个元素的个数,每次窗口移动后更新元素的个数,如果元素个数相同就表示有 异位词

代码
class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        int lengthS = s.length(), lengthP = p.length();
        if (lengthS < lengthP) return new ArrayList<>();

        int[] numP = new int[26];
        int[] numS = new int[26];
        for (int i = 0; i < lengthP; i++) {
            numS[getIndex(s.charAt(i))]++;
            numP[getIndex(p.charAt(i))]++;
        }

        List<Integer> ans = new ArrayList<>();
        int left = 0, right = lengthP - 1;
        while (right < lengthS) {
            if (Arrays.equals(numS, numP)) {
                ans.add(left);
            }
            numS[getIndex(s.charAt(left++))]--;
            if (++right >= lengthS) break;
            numS[getIndex(s.charAt(right))]++;
        }
        return ans;
    }

    private int getIndex(char ch) {
        return ch - 'a';
    }
}

你可能感兴趣的:(Leetcode,模拟,leetcode,算法,动态规划)