大家好,我是阿改。
随着互联网大厂面试难度的提升,算法题的难度也越来越高,手撕算法题也变成了面试中不可或缺的一部分,今天我们来解析leecode的49.字母异位词分组。
题目链接
题目描述
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]输出: [[""]]
示例 3:
输入: strs = ["a"]输出: [["a"]]
解题思路
由题意可知,将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
将含有相同字母顺序不同的单词放入同一个数组;
如["nat","tan"]都由一个a,一个n,一个t构成,所以分到一组,["ate","eat","tea"]都是一个a,一个e,一个t,所以分到一组。
我们可以创建一个key-val的容器,C++可以使用unordered_map,Go可以使用map,key保存排序后的字符串,val设定成数组,将排序后相同的字符串放进同一个val数组中。
代码实现
C++版本:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
unordered_map<string,vector<string>>map;
for(auto &s:strs){
string tmp = s;
sort(tmp.begin(),tmp.end());
map[tmp].push_back(s);
}
vector<vector<string>>ans;
ans.reserve(map.size());
for(auto &[key,vec]:map){
ans.push_back(vec);
}
return ans;
}
GO版本:
func groupAnagrams(strs []string) [][]string {
numsMap := make(map[string][]string)
for _,str := range strs {
sort_str := []byte(str)
sort.Slice(sort_str,func(i int,j int)bool{
return sort_str[i]<sort_str[j]
})
key := string(sort_str)
numsMap[key] = append(numsMap[key],str)
}
var ans [][]string
for _,vec := range numsMap{
ans=append(ans,vec)
}
return ans
}
如果大家觉得阿改写的不错,希望可以赏个脸关注下微信公众号哦!
please!please!please!