leetcode 49. 字母异位词分组

若没有重复字母的时候可以这样 用一个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;
}

leetcode 49. 字母异位词分组_第1张图片
将排序后的字符串作为key

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;
    }
};

leetcode 49. 字母异位词分组_第2张图片

将每一个字母对应一个质数,然后将他们的乘积作为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;
    }
};

leetcode 49. 字母异位词分组_第3张图片

你可能感兴趣的:(leetcode)