![]()
解题思路:还是滑动窗口题,主要是如何记录p内所有字符的情况,一种方法就是用2个长26的数组,用'str'-a对数组加值,先把p的那个数组确定,然后用end遍历S,每进一个对应的数组的值就加1,如果长度超过p就把start的对应的值减1,然后start++,如果最后长度等于p,那就比较两个数组,相同的话就把start的值加到结果列表中,最后返回。我的想法是当窗口达到后,用sort排序,如果和排序后的p相同放进去,时间更长。
class Solution {
public List<Integer> findAnagrams(String s, String p) {
List<Integer> list = new ArrayList<>();
int[] origin = new int[26];
int[] now = new int[26];
for(char str:p.toCharArray()) origin[str-'a']++;
int start = 0;
for(int end=0;end<s.length();++end){
now[s.charAt(end)-'a']++;
if(end-start+1>p.length()){
now[s.charAt(start)-'a']--;
start++;
}
if(end-start+1==p.length()){
if(Arrays.equals(origin,now)) list.add(start);
}
}
return list;
}
}
class Solution {
public List<Integer> findAnagrams(String s, String p) {
List<Integer> res = new ArrayList<>();
int start = 0;
char[] strs = s.toCharArray();
char[] q = p.toCharArray();
Arrays.sort(q);
for(int end=0;end<s.length();++end){
if(p.indexOf(s.charAt(end))==-1){
start = end+1;
continue;
}
if(end-start+1>p.length())
start+=1;
if(end-start+1<p.length()) continue;
char[] substrs = Arrays.copyOfRange(strs,start,end+1);
Arrays.sort(substrs);
if(Arrays.equals(substrs, q)){
res.add(start);
}
}
return res;
}
}