題目描述:hhttps://leetcode.com/problems/find-all-anagrams-in-a-string/
題目本身並不難,這裏主要比較兩種方法在時間上的差異:
方法一:
/*
794ms
*/
public class Solution {
public List<Integer> findAnagrams(String s, String p) {
List<Integer> list = new ArrayList<Integer>();
if(s==null || p==null || s.length()<p.length()){
return list;
}
for(int i=0; i+p.length()-1<s.length(); i++){
String sub = s.substring(i, i+p.length());
if(isAnagrams(sub, p)){
list.add(i);
}
}
return list;
}
public boolean isAnagrams(String a, String b){
if(a==null || b==null || a.length()!=b.length()){
return false;
}
int[] chars = new int[26];
for(int i=0; i<a.length(); i++){
char ch = a.charAt(i);
chars[ch-'a']++;
}
for(int i=0; i<b.length(); i++){
char ch = b.charAt(i);
chars[ch-'a']--;
if(chars[ch-'a']<0){
return false;
}
}
return true;
}
}
方法二:
/*
18ms
*/
public class Solution {
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;
}
private boolean check(int counter[],int tmp[]){
for(int i=0;i<26;i++) if (counter[i] != tmp[i]) return false;
return true;
}
}