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".
思路:同向双指针,注意check收集到的东西是否相等,要check两个count array是否频率一致;而且判断是否收集满了,是以pcount为标准,而不是以0为标准;
class Solution {
public List<Integer> findAnagrams(String s, String p) {
List<Integer> list = new ArrayList<>();
char[] ss = s.toCharArray();
char[] pp = p.toCharArray();
int[] scount = new int[26];
int[] pcount = new int[26];
int pc = 0;
for(int i = 0; i < p.length(); i++) {
if(pcount[p.charAt(i) - 'a'] == 0) {
pc++;
}
pcount[p.charAt(i) - 'a']++;
}
int j = 0;
int sc = 0;
for(int i = 0; i < s.length(); i++) {
while(j < s.length() && sc < pc) {
scount[s.charAt(j) - 'a']++;
if(scount[s.charAt(j) - 'a'] == pcount[s.charAt(j) - 'a']) {
sc++;
}
j++;
}
if(sc == pc && isSame(scount, pcount)) {
list.add(i);
}
// move i;
scount[s.charAt(i) - 'a']--;
if(scount[s.charAt(i) - 'a'] < pcount[s.charAt(i) - 'a']) {
sc--;
}
}
return list;
}
private boolean isSame(int[] A, int[] B) {
for(int i = 0; i < A.length; i++) {
if(A[i] != B[i]) {
return false;
}
}
return true;
}
}