標籤:style class blog code java color
Given an array of strings, return all groups of strings that are anagrams.Note: All inputs will be in lower-case.
Analysis: 這個題簡單的版本是判斷兩個單詞是不是anagram,一般來說有兩種方法。第一種方法是用hashmap,key是字元,value是出現的次數,如果兩個單詞構成的hashmap相同,那麼就是anagram。實現起來就是用一個構建hashmap,然後另一個在前面的hashmap中逐個去除,最後如果hashmap為空白,即返回true。這個方法時間複雜度是O(m+n),m,n分別是兩個單詞的長度。而空間複雜度是O(字元集的大小)。第二種方法是將兩個單詞排序,如果排序之後結果相同,就說明兩個單詞是anagram。這種方法的時間複雜度取決於排序演算法,一般排序演算法是O(nlogn),如果字元集夠小,也可以用線性排序演算法。不過總體來說,如果是判斷兩個單詞的,第一種方法要直接簡單一些。
接下來我們看看這道題,是在很多字串裡面按照anagram分類,如果用hashmap的方法,然後兩兩匹配,在分組會比較麻煩。而如果用排序的方法則有一個很大的優勢,就是排序後的字串可以作為一個key,也就是某一個class的id,如此只要對每一個字串排序,然後建立一個hashmap,key是排序後的串,而value是所有屬於這個key類的字串,這樣就可以比較簡單的進行分類。假設我們有n個字串,字串最大長度是k,那麼該演算法的時間複雜度是O(nklogk),其中O(klogk)是對每一個字串排序(如果用線性演算法也可以提高)。空間複雜度則是O(nk),即hashmap的大小。實現代碼如下:
Notice: 遇到這一個錯誤:
Input:["",""] Output:[] Expected:["",""]
原因在於第8行,我以前寫的是:String afterprocess = temp.toString(); 看來對“”不管用,改成String afterprocess = new String(temp);就對了,原因?
還有第19行的做法,第21行的做法我第一次用,需要掌握
1 public class Solution { 2 public ArrayList<String> anagrams(String[] strs) { 3 HashMap<String, ArrayList<String>> anagramlist = new HashMap<String, ArrayList<String>>(); 4 ArrayList<String> results = new ArrayList<String>(); 5 if (strs == null || strs.length ==0) return results; 6 for (String single : strs) { 7 char[] temp = single.toCharArray(); 8 java.util.Arrays.sort(temp); 9 String afterprocess = new String(temp);10 if (anagramlist.containsKey(afterprocess)) {11 anagramlist.get(afterprocess).add(single);12 }13 else {14 ArrayList<String> list = new ArrayList<String>();15 list.add(single);16 anagramlist.put(afterprocess, list);17 }18 }19 for (ArrayList<String> each : anagramlist.values()) {20 if (each.size() > 1) {21 results.addAll(each);22 }23 }24 return results;25 }26 }