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:
1 2 3 4 5 6 7 8 9
| 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:
1 2 3 4 5 6 7 8 9 10
| 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".
|
HashMap + Two Pointers
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| public List<Integer> findAnagrams(String s, String p) { List<Integer> list = new ArrayList<>(); if (s == null || s.length() == 0 || p == null || p.length() == 0) return list; int[] hash = new int[256]; for (char c : p.toCharArray()) { hash[c]++; } int left = 0, right = 0, count = p.length(); while (right < s.length()) { if (hash[s.charAt(right)] >= 1) { count--; } hash[s.charAt(right)]--; right++; if (count == 0) { list.add(left); } if (right - left == p.length()) { if (hash[s.charAt(left)] >= 0) { count++; } hash[s.charAt(left)]++; left++; } } return list; }
|