題目描述:
49. 字母異位詞分組
難度 中等
給你一個字符串數組,請你將?字母異位詞?組合在一起。可以按任意順序返回結果列表。
字母異位詞?是由重新排列源單詞的所有字母得到的一個新單詞。
示例 1:
輸入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
輸出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
輸入: strs = [""]
輸出: [[""]]
示例 3:
輸入: strs = ["a"]
輸出: [["a"]]
解題思路分析:
?題目意思簡而言之就是,所有輸入的單詞,不關注單詞中字母的排列順序,只要字母都相同的就分為一組。
那么我們可以創建一個map集合,map集合的key存放每個單詞排序后的字符串,map集合的value存放一個List集合(該集合中存放所有字母都相同的單詞)。
實現步驟:
1.將輸入的字符串數組分別循環取出
2.取出字符數組中的單個字符串后,再將將每個字符串轉成字符數組
3.把字符數組排序后再轉成字符串作為map集合的key
4.查看map集合中是否有排序后字符串的key對應的值,沒有則對該key創建一個value值(ArrayList<String>)
5.將當前的字符串存放到當前key對應的map集合中
6.創建一個ArrayList集合存入所有map集合的value后返回【return ArrayList<List<String>>(map.values())】
注意:List<String> list = map.getOrDefault(key, new ArrayList<String>()); 這里用List接收(向上轉型,這個是java基礎不清楚的小伙伴可以去回顧一下這里不再贅述)
代碼:?
class Solution {public List<List<String>> groupAnagrams(String[] strs) {Map<String, List<String>> map = new HashMap();// 循環每個字符串數組for (String str : strs) {// 將字符串數組轉成字符數組char[] chars = str.toCharArray();// 將字符數組中的字符排序Arrays.sort(chars);// 將排序后的字符數組轉成新的排序后字符串String key = new String(chars);// 獲取當前map集合中key對應的list集合,沒有則新建一個list集合List<String> list = map.getOrDefault(key, new ArrayList<String>());// 將當前字符串添加到list集合中list.add(str);// 存入排序后的字符串作為key,存入當前字符串map.put(key, list);}// 取出map中的所有value放入ArrayList集合中返回 return new ArrayList<List<String>>(map.values());}
}
?最后大功告成!?
?