给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"],
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
说明:
所有输入均为小写字母。
不考虑答案输出的顺序。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/group-anagrams
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
完整代码
遍历整个字符串数组,将结果先放到map中,map的键是字母排序后的结果,值是字符串数组中原有的样式
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> res;
if(strs.size() == 0)
return res;
map<string,vector<string>> m;
for(int i = 0; i < strs.size(); ++i){
string s = strs[i];
sort(s.begin(), s.end());
m[s].push_back(strs[i]);
}
for(auto a : m){
res.push_back(a.second);
}
return res;
}
};
算数相乘
参考:leetcode
算数基本定理:对于每个大于1的自然数,要么是质数,要么可以分解成质数乘积的形式。
利用上述基本定理,将字符串中的每一个字符,对应成一个质数,求字符串中的每一个字符字符对应质数的乘积,该结果必然是唯一的,那么乘积结果相同的放在一个数组里。
记住这种思想,但在写代码实现的时候会出现最后几个测试用例溢出,即使定义成long long类型也解决不了。
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> res;
if(strs.size()==0)
return res;
vector<int> prime = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103};
map<long long,vector<string>> m;
for(int i = 0; i < strs.size(); ++i){
long long s = 1;
for(int j = 0; j < strs[i].length(); ++j){
s *= prime[(strs[i][j]-'a')];
}
m[s].push_back(strs[i]);
}
for(auto a : m){
res.push_back( a.second );
}
return res;
}
};
提交结果:
95 / 101 个通过测试用例
状态:执行出错
提交时间:0 分钟之前
执行出错信息:
Line 12: Char 19: runtime error: signed integer overflow: 71 * 800384585750513951 cannot be represented in type 'long long int' (solution.cpp)
最后执行的输入:
["compilations","bewailed","horology","lactated","blindsided","swoop","foretasted","ware","abuts","stepchild","arr……
解法三
评论区中还有一种解法,就是统计每个字符出现的次数,然后进行对比。