1 解题报告
这道题,其实也就是要求从S中找到一个子串,这个子串变化后可以得到P(其实就是这个子串的26字母的分布和P一样)
所以自然而然的,我使用了最naïve的方式,就是直接滑动窗口(长度为P的大小),检查S的每一个子串的分布情况和P是否一样就可以了。
当然还可以优化检查的流程,但是既然AC了,我就不优化了~~~等不能通过那天再说
2 原题
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".
3 AC解
public class Solution {
private boolean check(int counter[],int tmp[]){
for(int i=0;i<26;i++) if (counter[i] != tmp[i]) return false;
return true;
}
/**
* 滑动窗口+每滑动一次就检查一次
* */
public List<Integer> findAnagrams(String s, String p) {
List<Integer> res = new ArrayList<Integer>();
if(s.length() < p.length()) return res;
char S[] = s.toCharArray();
char P[] = p.toCharArray();
int counter[] = new int[26];
int tmp[] = new int[26];
for(char c:P) counter[c-'a']++;
for(int i=0;i<P.length;i++) tmp[S[i]-'a']++;
if(check(counter,tmp)) res.add(0);
for(int i=P.length;i<S.length;i++){
tmp[S[i-P.length]-'a']--;
tmp[S[i]-'a']++;
if(check(counter,tmp)) res.add(i-P.length+1);
}
return res;
}
}