標籤:索引值 fill 判斷 編碼 調用 get inpu span 比較
題目:同字元分組
難度:Medium
題目內容:
Given an array of strings, group anagrams together.
翻譯:給定一組字串數組,按相同字元組成的字串分為一組。
Example:
Input: ["eat", "tea", "tan", "ate", "nat", "bat"],Output:[ ["ate","eat","tea"], ["nat","tan"], ["bat"]]
我的思路:因為要分組,那麼使用map即可,相同的字元作為鍵,值為一個List作為對應分組
1、首先遍曆,每次將當前字串打斷成char數組,然後sort,判斷map中是否包含此sort後的char
2、是的話則將此字串add進此key對應的值(List)裡面
否則往map裡put一個新的索引值對
My Code:
1 public List<List<String>> groupAnagrams(String[] strs) { 2 if (strs == null || strs.length == 0) return new ArrayList<List<String>>(); 3 Map<String, List<String>> map = new HashMap<String, List<String>>(); 4 for (String s : strs) { 5 char[] ca = s.toCharArray(); 6 Arrays.sort(ca); 7 String keyStr = String.valueOf(ca); 8 if (!map.containsKey(keyStr)) map.put(keyStr, new ArrayList<String>()); 9 map.get(keyStr).add(s);10 }11 return new ArrayList<List<String>>(map.values());12 }
我的複雜度:O(N*K*logK) ———k為最長的字串長度,sort方法為klogk
編碼過程中的問題:
1、一開始使用的鍵為char[],後來發現數組的equals方法使用的是最原始的比較地址,並不會比較其中的內容,所以改成了String就好了;
2、將map轉為List只需要調用map.values()方法就會返回一個包含所有元素的Collection,然後用其子類的構造方法接住都行。
答案代碼:
1 public List<List<String>> groupAnagrams(String[] strs) { 2 if (strs.length == 0) return new ArrayList(); 3 Map<String, List> ans = new HashMap<String, List>(); 4 int[] count = new int[26]; 5 for (String s : strs) { 6 Arrays.fill(count, 0); 7 for (char c : s.toCharArray()) count[c - ‘a‘]++; 8 9 StringBuilder sb = new StringBuilder("");10 for (int i = 0; i < 26; i++) {11 sb.append(count[i]);12 }13 String key = sb.toString();14 if (!ans.containsKey(key)) ans.put(key, new ArrayList());15 ans.get(key).add(s);16 }17 return new ArrayList(ans.values());18 }
答案複雜度:O(N*K)
答案思路:
1、和我的方法一樣對String數組進行迴圈;
2、然後沒有使用排序,而是做了一個只包含26個元素的數組,直接記錄26個字母各有多少個
3、將這26個int,按順序取出並拼接成一個字串,這樣也能表示使用相同字母的字串的key
4、map沒有則用此key,put一個List(有則不需要操作)。然後對應key的List直接add進當前String。
LeetCode第[49]題(Java):Group Anagrams