49 字母异位词分组、
题目:给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
示例:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
思考:
- 使用哈希表<异位词排序后的值(每一组异位词排序后的值都相同),同组异位词>
- 遍历strs,每一个s都先排序
- 然后map.putIfAbsent,再get后add
public class Solution {
/**
* 字母异位词分组
* 输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
* 输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
*/
public List<List<String>> groupAnagrams(String[] strs) {
// 哈希表<异位词排序后的值(每一组异位词排序后的值都相同),同组异位词>
Map<String, List<String>> map = new HashMap<>();
for (String s : strs) {
char[] cs = s.toCharArray();
// 先排序,使得每一组异位词排序后的值都相同
Arrays.sort(cs);
String sorted = new String(cs);
// putIfAbsent:如果v不存在,就新生成一个指定v;如果v存在,就忽略
map.putIfAbsent(sorted, new LinkedList<>());
map.get(sorted).add(s);
}
// map.values()是一个list
return new LinkedList<>(map.values());
}
public static void main(String[] args) {
Solution solution = new Solution();
String[] strs = {"eat", "tea", "tan", "ate", "nat", "bat"};
System.out.println(solution.groupAnagrams(strs));
}
}