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"]]
思路
对比字符串是否异位 可以先对其排序 排序后一致则说明异位
对于每个字母异位词 可以以
key值为字母异位词的排序后的字符序列,value值存储满足同一异位词的字符串集合
最后遍历哈希表,将每一个key对应的集合插入答案集合.
代码
class Solution {
public:
vector> groupAnagrams(vector& strs) {
unordered_map> mp;//哈希表
string temp;
vector> ans;//答案数组
for(decltype(strs.size()) i=0;isecond).push_back(strs[i]);
}else//未发现对应 异位词 更新key值
{
mp.insert(pair>(temp,{strs[i]}));
}
}
for(auto p : mp)//遍历hash
{
ans.push_back(p.second);
}
return ans;
}
};
官方答案
class Solution {
public:
vector> groupAnagrams(vector& strs) {
unordered_map> mp;
for (string& str: strs) {
string key = str;
sort(key.begin(), key.end());
mp[key].emplace_back(str);
}
vector> ans;
for (auto it = mp.begin(); it != mp.end(); ++it) {
ans.emplace_back(it->second);
}
return ans;
}
};
其实还有一种思路 因为对应26个字母
可以将字母对应成26个质数 然后对字符串每个字符对应质数作乘积 如果乘积相同 则为异位数