LeetCode第[49]題(Java):Group Anagrams

來源:互聯網
上載者:User

標籤:索引值   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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.