OA原题描述参考:

注意:具体抽到的题目可能会有细微变化。

leetcode 438 原题

解题思路参考:

hash存字符s所有字符的出现频率。然后对p的字符进行滑动窗口查找,符合条件就记录位置。

参考答案:

public class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        // using pointers to keep a window
        List<Integer> res = new ArrayList<Integer>();
        if (s == null || p == null || s.length() < p.length()) {
            return res;
        }
        char[] source = s.toCharArray();
        char[] target = p.toCharArray();

        char[] pHash = new char[26];//only 26 characters
        char[] sHash = new char[26];

        for (char sc : target) {
            pHash[sc - 'a']++;
        }

        //start from 1st windows
        for (int i = 0; i < target.length; i++) {
            sHash[source[i] - 'a']++;
        }

        if (check(pHash, sHash)) {
            res.add(0);
        }

        for (int i = target.length; i < source.length; i++) {
            sHash[source[i - target.length] - 'a']--;
            sHash[source[i] - 'a']++;
            if (check(pHash, sHash)) {
                res.add(i - target.length + 1);
            }
        }

        return res;

    }

    private boolean check(char[] hash, char[] window) {
        for (int i = 0; i < hash.length; i++) {
            if (hash[i] != window[i]) {
                return false;
            }
        }
        return true;
    }
}

results matching ""

    No results matching ""