438. Find All Anagrams in a String

这个题挺有意思的,O(nk)的办法比较简单,K是pattern的长度。

说说O(n)的。
一开始O(NK)只是觉得滑窗之后没必要每次都遍历整个pattern。

比如右边新加入的char,在map中找不到,那么就开始缩小窗口,这个过程中会增加map中的char个数。

比如a b c a找 abc,right到最右边的a的时候发现MAP中a的数量不足,此时left右移,右移之后发现a够了,再判断一次,然后right继续移动。

但是逻辑总写不好。。可能想的也不对,然后看的答案。。

主要是最后一行,左移之后发现某个char数量大于0了,说明我们需要找的char又多了一个,于是need++。。

Time: O(n)
Space: O(1)

public class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        List<Integer> res = new ArrayList<>();
        int[] pattern = new int[26];
        int[] string = new int[26];
        for (int i = 0; i < p.length(); i++) {
            pattern[s.charAt(i) - 'a']++;
        }
        int l = 0;
        int r = 0;
        int need = p.length();
        
        while (r < s.length()) {
            if (--pattern[s.charAt(r) - 'a'] >= 0) need--;
            r++;
            if (need == 0) res.add(l);
            if (r - l  == p.length()) {
                pattern[s.charAt(l) - 'a']++;
                if (pattern[s.charAt(l++) - 'a'] > 0) need++;   // one more needed to match
            }
        }
        
        return res;
    }
}
posted @ 2016-11-05 10:32  哇呀呀..生气啦~  阅读(1011)  评论(1)    收藏  举报