LeetCode 438: Find All Anagrams in a String
2016-11-28 20:48
465 查看
题目描述:hhttps://leetcode.com/problems/find-all-anagrams-in-a-string/
题目本身并不难,这里主要比较两种方法在时间上的差异:
这种方法所需时间很长。
AC代码
AC代码:
题目本身并不难,这里主要比较两种方法在时间上的差异:
方法一:
每次去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 #438: Find All Anagrams in a String
- LeetCode:438. Find All Anagrams in a String
- LeetCode笔记:438. Find All Anagrams in a String
- LeetCode438 Find All Anagrams in a String
- [leetcode: Python]438. Find All Anagrams in a String
- [python]leetcode(438). Find All Anagrams in a String
- 【Leetcode】438. Find All Anagrams in a String
- Leetcode——438. Find All Anagrams in a String
- Leetcode 438 Find All Anagrams in a String
- leetcode_438. Find All Anagrams in a String
- LeetCode 438. Find All Anagrams in a String (在字符串中找到所有的变位词)
- Leetcode 438. Find All Anagrams in a String 找变位子串 解题报告
- LeetCode 438 Find All Anagrams in a String
- leetcode 438. Find All Anagrams in a String 一个简单的移动窗口问题
- leetcode 438[easy]---Find All Anagrams in a String
- leetcode[438] Find All Anagrams in a String
- 438. Find All Anagrams in a String
- 438. Find All Anagrams in a String*
- Leetcode 之 Find All Anagrams in a String
- 438. Find All Anagrams in a String