您的位置:首页 > 其它

LeetCode 438: Find All Anagrams in a String

2016-11-28 20:48 465 查看
题目描述:hhttps://leetcode.com/problems/find-all-anagrams-in-a-string/

题目本身并不难,这里主要比较两种方法在时间上的差异:

方法一:

每次去s中与q长度相等的字串,比较两个字符串是否为Anagram。
这种方法所需时间很长。
AC代码
/*
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;
}
}

方法二:

在比较两个字符串是否为Anamgram时,我们用的方法是统计两个字符串中,各个字母的数量是否相同。那么其实当我们将某一个字串与字符串P比较时,并不需要从头开始统计,只需要将上一次的统计结果稍做修改就可以了:上一个子串的第一个字母数量减一,本子串最后一个字母数量加一。
AC代码:
/*
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode