暴力解法:

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        List<Integer> list = new ArrayList();
        char[] pChars = p.toCharArray();
        Arrays.sort(pChars); // 给p排序以便判断
        int n = pChars.length;
        for (int i = 0; i <= s.length() - n; i++) { // 这边注意是"<="不然会漏掉一个
            char[] cur = s.substring(i, i + n).toCharArray(); // 截取当前索引的子串
            Arrays.sort(cur); // 给当前子串排序
            if (Arrays.equals(cur, pChars)) list.add(i); // 子串等于p,添加索引到list中
        }
        return list;
    }
}

滑动窗口:

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        if (s.length() < p.length()) return new ArrayList(); // 给的字符串长度小于目标长度直接返回空列表
        List<Integer> list = new ArrayList(); // 存放结果
        Map<Character, Integer> pMap = new HashMap(), winMap = new HashMap(); // pMap存放目标p中每个字符的数量,winMap存放滑动窗口的字符数量
        for (char ch : p.toCharArray()) pMap.put(ch, pMap.getOrDefault(ch, 0) + 1); // 填充pMap
        int pLen = p.length();
        char[] chars = s.toCharArray();
        int l = 0, r = 0, count = 0; // 定义左、右指针,窗口中已经满足目标字符的个数
        while (r < chars.length) {
            char chR = chars[r];
            if (pMap.containsKey(chR)) { // 判断右指针上的字符为目标字符
                winMap.put(chR, winMap.getOrDefault(chR, 0) + 1); // 表中该字符对应值加一(添加该字符到窗口)
                if (winMap.get(chR) <= pMap.get(chR)) count++; // 只要窗口中该字符数量没超过目标中该字符数量就count++
            }
            while (count == pLen) { // 判断窗口中含有目标所有字符
                if (r - l + 1 == pLen) list.add(l); // 如果窗口长度也和目标一致,则找到一个结果,否则需要利用左指针去除非目标字符
                char chL = chars[l];
                if (pMap.containsKey(chL)) { // 判断左指针上的字符为目标字符
                    winMap.put(chL, winMap.getOrDefault(chL, 0) - 1); // 表中该字符对应值加一(从窗口移除该字符)
                    if (winMap.get(chL) < pMap.get(chL)) count--; // 与前面的同理,使count维持在满足目标字符个数的范围内
                }
                l++; // 只要窗口含有所有目标字符,就继续右移左指针,同时去除非目标字符
            }
            r++;
        }
        return list;
    }
}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐