1. 程式人生 > 其它 >【LeetCode】49. 字母異位詞分組【排序+Map】

【LeetCode】49. 字母異位詞分組【排序+Map】

技術標籤:LeetCode

題目連結:https://leetcode-cn.com/problems/group-anagrams/

難度:中等

題目描述

給定一個字串陣列,將字母異位詞組合在一起。字母異位詞指字母相同,但排列不同的字串。

測試用例

示例:

輸入: ["eat", "tea", "tan", "ate", "nat", "bat"]
輸出:
[
["ate","eat","tea"],
["nat","tan"],

["bat"]
]

說明

所有輸入均為小寫字母。
不考慮答案輸出的順序。

題解

由於互為字母異位詞的兩個字串包含的字母相同,因此對兩個字串分別進行排序之後得到的字串一定是相同的,故可以將排序之後的字串作為雜湊表的鍵。

時間複雜度:O(nklogk),其中 n是 strs 中的字串的數量,k 是strs 中的字串的的最大長度。

本題和之前做的HDU - 1004 Let the Balloon Rise類似。

從這個題開始,試著探究一下Java原始碼。

方法:map.getOrDefault()

Map.getOrDefault(Object key, V defaultValue)方法的作用是:

  當Map集合中有這個key時,就返回key對應的value;
  如果沒有返回預設值defaultValue。

原始碼如下:

default V getOrDefault(Object key, V defaultValue) {
        V v;
        return (((v = get(key)) != null) || containsKey(key))
            ? v
            : defaultValue;
    }

方法: Map.put(K key, V value)

如果map中不存在key,則將鍵值對加入map。

如果map中已存在key,則用新的value代替舊的value。

實現程式碼

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String, List<String>> mmp = new HashMap<String, List<String>>();
        for (String str : strs){
            char[] arrayStr = str.toCharArray();
            Arrays.sort(arrayStr); // 對字串的字元排序
            String key = new String(arrayStr);
            List<String> list = mmp.getOrDefault(key, new ArrayList<String>());
            list.add(str); // 將新的字串加入list
            mmp.put(key, list); // 更新map
        }
        return new ArrayList<List<String>>(mmp.values());
    }
}