若没有重复字母的时候可以这样 用一个int来存储字符串中含有的字符 然后将该int 映射到一个vector 上 c++ map 真好用!
与
leetcode 318. 最大单词长度乘积
https://blog.csdn.net/L1558198727/article/details/88902567
用法相同
可惜这个题目单词中有重复的字母
#include
using namespace std;
#define debug(x) cout<<#x<<": "<
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> ret;
map<int,vector<string>> mpv;
for(int i=0;i<strs.size();i++){
int key = 0;
for(int j=0;j<strs[i].size();j++){
key |= 1<<(strs[i][j]-'a');
}
//debug(key);
mpv[key].push_back(strs[i]);
}
map<int,vector<string>> :: iterator it;
for(it=mpv.begin();it!=mpv.end();it++){
ret.push_back(it->second);
}
return ret;
}
};
int main()
{
Solution Solution1;
vector<string> strs = {"eat", "tea", "tan", "ate", "nat", "bat"};
vector<vector<string>> ret = Solution1.groupAnagrams(strs);
for(auto i:ret){
for(auto j:i){
cout<<j<<" ";
}
cout<<endl;
}
return 0;
}
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> ret;
map<string,vector<string>> mpv;
for(int i=0;i<strs.size();i++){
string key = strs[i];
sort(key.begin(),key.end());
//debug(key);
mpv[key].push_back(strs[i]);
}
map<string,vector<string>> :: iterator it;
for(it=mpv.begin();it!=mpv.end();it++){
ret.push_back(it->second);
}
return ret;
}
};
将每一个字母对应一个质数,然后将他们的乘积作为key值
但是这样就会超过long long的范围 所以每次乘完之后对1e9+7取余了 虽然可能出现冲突但是还是试了一波 发现在已知的样例里面没有冲突
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> ret;
vector<long long> pri={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};
//debug(pri.size());
map<long long,vector<string>> mpv;
for(int i=0;i<strs.size();i++){
long long key = 1;
for(int j=0;j<strs[i].size();j++){
key *= pri[strs[i][j]-'a'];
key %= 10000000007;
}
//debug(key);
mpv[key].push_back(strs[i]);
}
map<long long,vector<string>> :: iterator it;
for(it=mpv.begin();it!=mpv.end();it++){
ret.push_back(it->second);
}
return ret;
}
};