给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
解题思路:由于字母异位词中每个字母出现的次数是一定的,只是顺序不同,所以很容易想到的思路是创建一个哈希表,哈希表的键是异位词生成的键,如eatt,teta,ttea这三个异位词就可以生成一个a1e1t2的键,然后哈希表的值是一个字符串列表,用来放键相同的异位词,遍历完所有字符串之和就可以将哈希表的值输出出来。
class Solution {
public List<List<String>> groupAnagrams(String[] strs)
{ Map<String, List<String>> map = new HashMap<String, List<String>>();
for (String str : strs)
{ int[] counts = new int[26];
int length = str.length();
for (int i = 0; i < length; i++)
{ counts[str.charAt(i) - 'a']++; }
// 将每个出现次数大于 0 的字母和出现次数按顺序拼接成字符串,作为哈希表的键
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 26; i++)
{ if (counts[i] != 0)
{ sb.append((char) ('a' + i));
sb.append(counts[i]); } }
String key = sb.toString();
List<String> list = map.getOrDefault(key, new ArrayList<String>());
list.add(str);
map.put(key, list); }
return new ArrayList<List<String>>(map.values()); } }