leetcode49.字母异位次分组

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

示例:

输入: ["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……

解法三
评论区中还有一种解法,就是统计每个字符出现的次数,然后进行对比。

发布了217 篇原创文章 · 获赞 9 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_31672701/article/details/103915969
今日推荐