leetcode 49 字母异位分组(字符串排序+哈希表)
链接:https://leetcode-cn.com/problems/group-anagrams/
题目
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母都恰好只用一次。
用例
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
思路
对比字符串是否异位 可以先对其排序 排序后一致则说明异位
对于每个字母异位词 可以以<string,vector< string>> 存入hash表
key值为字母异位词的排序后的字符序列,value值存储满足同一异位词的字符串集合
最后遍历哈希表,将每一个key对应的集合插入答案集合.
代码
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
unordered_map<string,vector<string>> mp;//哈希表
string temp;
vector<vector<string>> ans;//答案数组
for(decltype(strs.size()) i=0;i<strs.size();i++)
{
temp=strs[i];
sort(temp.begin(),temp.end());//字符串排序
if(mp.find(temp)!=mp.end())//hash表中存在对应异位词
{
(mp.find(temp)->second).push_back(strs[i]);
}else//未发现对应 异位词 更新key值
{
mp.insert(pair<string,vector<string>>(temp,{strs[i]}));
}
}
for(auto p : mp)//遍历hash
{
ans.push_back(p.second);
}
return ans;
}
};
官方答案
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
unordered_map<string, vector<string>> mp;
for (string& str: strs) {
string key = str;
sort(key.begin(), key.end());
mp[key].emplace_back(str);
}
vector<vector<string>> ans;
for (auto it = mp.begin(); it != mp.end(); ++it) {
ans.emplace_back(it->second);
}
return ans;
}
};
其实还有一种思路 因为对应26个字母
可以将字母对应成26个质数 然后对字符串每个字符对应质数作乘积 如果乘积相同 则为异位数

浙公网安备 33010602011771号