给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
说明:
- 所有输入均为小写字母
- 不考虑答案输出的顺序。
Python解法
题目要求将字母异位词分组,即将由相同字母组成但排序不同的词分到同一组中。判断两个词组成的字符是否都相同,我们可以使用sorted()将单词按字典序排列后进行排序。然后将所有按字典序排列后相同的词分到一组中,同时结果使用字典存储,键为字典序排序结果,值为所有由键中字符排列组合得到的词。
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
if not strs: return []
# 字母异位单词可以通过字典序判断
res = dict() # {k : v},其中k为按字典序排序后的字符串,v为相同字典序字符串的数组
for word in strs:
key = ''.join(sorted(word))
if key in res.keys():
res[key].append(word)
else:
res[key] = [word]
return list(res.values())
Java解法
Java中没有直接的函数来对一个字符串进行字典序排序,而是需要借助String.toCharArray()先将字符串转换为char型数组,然后调用Arrays的sort()来进行排序。按照题目的要求可知,具有相同字典序的单词有多个,所以需使用一个Map来进行存储。最后返回Map的值所构成的列表即可,具体的测试代码如下所示:
class Solution {
public static List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> map = new HashMap<>();
for (String str : strs) {
char[] chars = str.toCharArray();
Arrays.sort(chars);
// 将char型数组转换为字符串作为key
String s = String.valueOf(chars);
if (map.containsKey(s) == true){
map.get(s).add(str);
} else {
ArrayList<String> list = new ArrayList<>();
list.add(str);
map.put(s, list);
}
}
map.forEach((k, v) -> System.out.println(v.toString()));
/*
[eat, tea, ate]
[bat]
[tan, nat]
*/
return new ArrayList(map.values());
}
public static void main(String[] args) {
String[] array = {"eat","tea","tan","ate","nat","bat"};
groupAnagrams(array);
}
}