LeetCode

Given a string s and a non-empty string p, find all the start indices of p's anagrams in s.

Strings consists of lowercase English letters only and the length of both strings s and p will not be larger than 20,100.

The order of output does not matter.

Example 1:

Input:
s: "cbaebabacd" p: "abc"

Output:
[0, 6]

Explanation:
The substring with start index = 0 is "cba", which is an anagram of "abc".
The substring with start index = 6 is "bac", which is an anagram of "abc".

Example 2:

Input:
s: "abab" p: "ab"

Output:
[0, 1, 2]

Explanation:
The substring with start index = 0 is "ab", which is an anagram of "ab".
The substring with start index = 1 is "ba", which is an anagram of "ab".
The substring with start index = 2 is "ab", which is an anagram of "ab".

正常都能想到的O(m*n)的解法肯定不行,这种hash+滑动窗口的解法非常的酷炫。

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        List<Integer> ret = new ArrayList<Integer>();
        if (s == null || s.equals(""))
            return ret;
        char[] chp = p.toCharArray();
        int[] hash = new int[256];
        for (char ch : chp)
            hash[ch] ++;
        
        int left=0, right=0, cnt=p.length();
        while (right < s.length()) {
            if (hash[s.charAt(right++)]-- > 0)
                cnt --;
            if (cnt == 0)
                ret.add(left);
            if (right-left == p.length() && hash[s.charAt(left++)]++ >= 0)
                cnt ++;
        }
        return ret;
    }
    
    
}

http://blog.csdn.net/chenwuji91/article/details/52981530

原文地址:https://www.cnblogs.com/wxisme/p/7418104.html