438. Find All Anagrams in a String
思路1:暴力解决,显然超时。
class Solution {
public List<Integer> findAnagrams(String s, String p) {
List<Integer> list=new ArrayList<Integer>();
char ch[]=p.toCharArray();
Arrays.sort(ch);
for(int i=0;i<=s.length()-p.length();i++) {
String temp=s.substring(i, i+p.length());
char ch2[]=temp.toCharArray();
Arrays.sort(ch2);
if(F(ch,ch2))
list.add(i);
}
return list;
}
boolean F(char ch1[],char ch2[]) {
for(int i=0;i<ch1.length;i++) {
if(ch1[i]!=ch2[i])
return false;
}
return true;
}
}
思路2:利用哈希统计每个字符出现的次数,然后判断是否是出现的次数相等,同时使用双指针向前移动。
class Solution {
public List<Integer> findAnagrams(String s, String p) {
List<Integer> list=new ArrayList<Integer>();
int hash[]=new int[255];
if(p.length()==0 || s.length()<p.length())
return list;
for(int i=0;i<p.length();i++) {
hash[p.charAt(i)]++;
hash[s.charAt(i)]--;
}
int left=0;
for(int j=p.length();j<s.length();j++,left++) {
if(F(hash))
list.add(left);
hash[s.charAt(left)]++;
hash[s.charAt(j)]--;
}
if(F(hash))
list.add(left);
return list;
}
boolean F(int hash[]) {
for(int i=0;i<hash.length;i++) {
if(hash[i]!=0)
return false;
}
return true;
}
}