给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
提示:
1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i]
仅包含小写字母
思路:
在评论区看到一种很骚的思路,于是试了一下,可以成功通过!思路是这个!
发布于 未知归属地
2019.03.04
在美版leetcode上看到大神的思路,用质数表示26个字母,把字符串的各个字母相乘,这样可保证字母异位词的乘积必定是相等的。其余步骤就是用map存储,和别人的一致了。(这个用质数表示真的很骚啊!!!)
但是如果只是相乘的话容易溢出,所以要%1000000007
直接看代码:
class Solution {
public:
struct st{
string a;
long long b;
}s[10001];
static bool cmp(st A,st B)
{
return A.b<B.b;
}
vector<vector<string>> groupAnagrams(vector<string>& strs) {
int z[26]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101};
map<char,int> m;
for(int i=97;i<97+26;i++)
{
m[char(i)]=z[i-97];
//m.insert(char(i),z[i-97]);
}
long long t=1;
for(int i=0;i<strs.size();i++)
{
t=1;
for(int j=0;j<strs[i].size();j++)
{
t=t*m[strs[i][j]]%1000000007;
}
s[i].a=strs[i];
s[i].b=t;
}
sort(s,s+strs.size(),cmp);
vector<string> vv;
vector<vector<string> > v;
vv.push_back(s[0].a);
for(int i=1;i<strs.size();i++)
{
if(s[i].b==s[i-1].b)vv.push_back(s[i].a);
else{
v.push_back(vv);
vv.clear();
vv.push_back(s[i].a);
}
}
v.push_back(vv);
return v;
}
};