Given a stringsand 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".
publicclassSolution {publicList<Integer> findAnagrams(String s,String t) {List<Integer> result =newLinkedList<>();if(t.length()>s.length()) return result;Map<Character,Integer> map =newHashMap<>();for(char c :t.toCharArray()){map.put(c,map.getOrDefault(c,0) +1); }int counter =map.size();int begin =0, end =0;while(end <s.length()){char c =s.charAt(end);if( map.containsKey(c) ){map.put(c,map.get(c)-1);if(map.get(c) ==0) counter--; } end++;while(counter ==0){char tempc =s.charAt(begin);if(map.containsKey(tempc)){map.put(tempc,map.get(tempc) +1);if(map.get(tempc) >0){ counter++; } }if(end-begin ==t.length()){result.add(begin); } begin++; } }return result; }}
Other Approach:
publicclassSolution {publicList<Integer> findAnagrams(String s,String p) {List<Integer> list =newArrayList<>();if (s ==null||s.length() ==0|| p ==null||p.length() ==0) return list;int[] hash =newint[256]; //character hash//record each character in p to hashfor (char c :p.toCharArray()) { hash[c]++; }//two points, initialize count to p's lengthint left =0, right =0, count =p.length();while (right <s.length()) {//move right everytime, if the character exists in p's hash, decrease the count//current hash value >= 1 means the character is existing in pif (hash[s.charAt(right)] >=1) { count--; } hash[s.charAt(right)]--; right++;//when the count is down to 0, means we found the right anagram//then add window's left to result listif (count ==0) {list.add(left); } //if we find the window's size equals to p, then we have to move left (narrow the window) to find the new match window
//++ to reset the hash because we kicked out the left//only increase the count if the character is in p//the count >= 0 indicate it was original in the hash, cuz it won't go below 0if (right - left ==p.length() ) {if (hash[s.charAt(left)] >=0) { count++; } hash[s.charAt(left)]++; left++; } }return list; }}