LeetCode438. 找到字符串中所有字母异位词

一、题目描述

☆☆☆二、解法

思路:滑动窗口法。用字母字典法判断两个词是否为字母异位词

代码1:截取法。(时间效率9.25%  (ㄒoㄒ)~~)

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        List<Integer> res = new ArrayList<>();
        if (s == null || s.length() < p.length()) return res;
        int[] dict = new int[26];
        int[] cur = new int[26];
        for (char c : p.toCharArray()) {
            dict[c - 'a'] ++;
        }
        for (int i = 0; i <= s.length() - p.length(); i++) {
            int j = i + p.length() - 1;
            String temp = s.substring(i,j+1);  //  结束索引(不包括)。
            for (char c : temp.toCharArray()) {
                cur[c - 'a'] ++;
            }
            if (help(dict,cur)) {
                res.add(i);
            }
            Arrays.fill(cur,0);
        }
        return res;
    }
    private boolean help(int[] a, int[] b) {
        for (int i = 0; i < a.length; i++) {
            if (a[i] != b[i]) {
                return false;
            }
        }
        return true;
    }
}

 

代码2:滑动窗口

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        List<Integer> res = new ArrayList<>();
        if (s == null || s.length() < p.length()) return res;
        int[] dict = new int[26];
        int[] cur = new int[26];
        int l = 0, r = 0;
        for (char c : p.toCharArray()) {
            dict[c - 'a'] ++;
        }
        while (r < s.length()) {
            int curR = s.charAt(r) - 'a';
            cur[curR] ++;
            r ++;
            // 当cur中curR 比 dict对应元素的个数多的时候,就要移动左窗口指针
            while (cur[curR] > dict[curR]) {
                cur[s.charAt(l) - 'a'] --;
                l ++;
            }
            if (r - l  == p.length()) {
                res.add(l);
            }
        }
        return res;
    }
}

 

posted @ 2020-12-07 22:14  不学无墅_NKer  阅读(56)  评论(0编辑  收藏  举报