【LeetCode】49. 字母異位詞分組【排序+Map】
阿新 • • 發佈:2020-12-15
技術標籤:LeetCode
題目連結:https://leetcode-cn.com/problems/group-anagrams/
難度:中等
題目描述
給定一個字串陣列,將字母異位詞組合在一起。字母異位詞指字母相同,但排列不同的字串。
測試用例
示例:
輸入: ["eat", "tea", "tan", "ate", "nat", "bat"]
輸出:
[
["ate","eat","tea"],
["nat","tan"],["bat"]
]
說明
所有輸入均為小寫字母。
不考慮答案輸出的順序。
題解
由於互為字母異位詞的兩個字串包含的字母相同,因此對兩個字串分別進行排序之後得到的字串一定是相同的,故可以將排序之後的字串作為雜湊表的鍵。
時間複雜度:,其中 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());
}
}