49. 字母异位词分组
49. Group Anagrams
题目:
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”],
输出:
[
[“ate”,”eat”,”tea”],
[“nat”,”tan”],
[“bat”]
]
说明:
- 所有输入均为小写字母。
- 不考虑答案输出的顺序。
题解:
核心思想是将字符串按字典序排序。字母异位词的特点是其排序后的单词一致,因此可以用排序后的单词为key
,把key
相同的单词放入类型为list
的value
中。
C++
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
unordered_map<string, vector<string>> cnt;
vector<vector<string>> res;
for(auto s : strs) {
string sortedS = s;
sort(sortedS.begin(), sortedS.end()); // 将单词按字典序排序
if(cnt.find(sortedS) == cnt.end()) { // 排序后的单词为key,单词放入value的list中
vector<string> vec;
vec.push_back(s);
cnt[sortedS] = vec;
}
else {
cnt[sortedS].push_back(s);
}
}
for(auto m : cnt) {
res.push_back(m.second);
}
return res;
}
};
Java
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
HashMap<String, List<String>> cnt = new HashMap<>();
List<List<String>> res = new ArrayList<>();
int n = strs.length;
for(int i = 0; i < n; i++) {
char chrs[] = strs[i].toCharArray();// Java中需要转为字符数组才能排序
Arrays.sort(chrs);
String sorted = String.valueOf(chrs);
List<String> list;
if(!cnt.containsKey(sorted)) {//以排序后的字符串为key,将单词存入value的list中
list = new ArrayList<>();
}
else {
list = cnt.get(sorted);
}
list.add(strs[i]);
cnt.put(sorted, list);
}
for(Map.Entry<String, List<String>> me : cnt.entrySet()) {
res.add(me.getValue());
}
return res;
}
}
Python
class Solution(object):
def groupAnagrams(self, strs):
"""
:type strs: List[str]
:rtype: List[List[str]]
"""
dic = dict([]) # 以单词字典序排序后的单词为key,存储字母异位词
for s in strs:
sList = list(s)
sList.sort()
sortedS = ''.join(sList)
if dic.has_key(sortedS):
dic[sortedS].append(s)
else:
curList = list([])
curList.append(s)
dic[sortedS] = curList
res = list([])
for k, v in dic.items():
res.append(v)
return res
JavaScript
/**
* @param {string[]} strs
* @return {string[][]}
*/
var groupAnagrams = function(strs) {
var m = new Map([]); // 以单词字典序排序后的单词为key,存储字母异位词
var res = [];
for(var s of strs) {
sortedS = s.split('').sort().join("");
if(m.get(sortedS) === undefined) {
var curList = [];
curList.push(s);
m.set(sortedS, curList);
}
else {
var curList = m.get(sortedS);
curList.push(s);
m.set(sortedS, curList);
}
}
for(var x of m) {
res.push(x[1]);
}
return res;
};