LeetCode 438: Find All Anagrams in a String

来源:互联网 发布:淘宝数据分析表格 编辑:程序博客网 时间:2024/05/16 17:26

题目描述: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;    }}


0 0