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; } }