LeetCode 打卡 2020-11-3(字母异位词分组)

49. 字母异位词分组

难度中等

给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

思路:

最开始看到示例中的输入,感觉输入中可能存在大量重复的字符串,考虑使用map记录当前字符串的数量,然后匹配其他长度一致的字符串,相同则加入向量并标记。

代码如下:运行至第 111/112 个输入样例时运行超时

    vector<vector<string>> groupAnagrams(vector<string>& strs) {

        vector<vector<string>> ans;

        int m[strs.size()];

        memset(m,false,sizeof(m));

        for(int i=0;i<strs.size();++i){

            if(m[i]) continue;

            int len=strs[i].size();

            ans.push_back(vector<string>());

            for(int j=i;j<strs.size();++j){

                if(len!=strs[j].size()) continue;

                bool add=true;

                unordered_map<char,int> temp;

                for(auto c:strs[i]){

                    temp[c]++;

                }

                for(auto c:strs[j]){

                    if(!temp[c]--){ add=false; continue; }// 如何返回而不会加入到其中

                }

                if(add) {ans.back().push_back(strs[j]); m[j]=true;}

            }

        }

        return ans;

    }

更新思路:勉强实现功能

考虑将重新生成一个字符串向量,将其中每个字符串排序,该字符串相等,则将原始字符串加入结果中,并标记为已添加项(即后续不处理)

    vector<vector<string>> groupAnagrams(vector<string>& strs) {

        vector<vector<string>> ans;

        vector<string> data=strs;

        int len=strs.size();

        for(int i=0;i<len;++i){

            sort(data[i].begin(),data[i].end());

        }

        bool M[len];

        memset(M,false,sizeof(M));

        for(int i=0;i<len;++i){

            if(M[i]) continue;

            ans.push_back(vector<string>());

            for(int j=i;j<len;++j){

                if(data[j]!=data[i]) continue;

                ans.back().push_back(strs[j]);

                M[j]=true;

            }

        }

        return ans;

    }

参考思路:

我个人仅考虑到字符串中各元素相加,但是结果可能会存在重复,某大佬则引入了质数相乘的概念,确保了各字符串一定不会出现相同结果。

vector<vector<string>> groupAnagrams(vector<string>& strs) {

        vector<vector<string>> ans;

        unordered_map <double,vector<string> > M;

        double a[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};

        for(string& s : strs)

        {

            double temp = 1;

            for(char c : s)

            temp *= a[c - 'a'];

            M[temp].push_back(s);           //  temp为单词对应的质数乘积,M[temp]为该单词的异位词构成的vector

        }

        for(auto& index : M)                   //  index为键和值组成的pair

            ans.push_back(index.second);

        return ans;

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值