49.字符串分类

来源:互联网 发布:医学数据分析公司 编辑:程序博客网 时间:2024/05/21 06:53

Group Anagrams

问题描述:

Given an array of strings, group anagrams together.

For example, given: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”],
Return:

[  ["ate", "eat","tea"],  ["nat","tan"],  ["bat"]]

知识补充:

字符串也可以进行排序

string s;sort(s.begin(),s.end());

参考答案中很巧妙地字符串中每个字符代表一个数字,通过计算他们的乘法,按题目规则不同的组合得到的结果是不同的,为了确保最后得到的结果不会重叠,用质数来代表每个字母,这样就不会出现不同字符串出现了相同结果。

测试代码:

class Solution {public:    vector<vector<string>> groupAnagrams(vector<string>& strs) {        vector<vector<string>> result;        vector<string> res;        string temp = "";        for(int i=0;i<strs.size();i++)        {            int j = 0;            temp = strs[i];            sort(temp.begin(),temp.end());            while(j<res.size())            {                if(res[j]==temp)                {                    result[j].push_back(strs[i]);                    break;                }                j++;            }            if(j==res.size())            {                res.push_back(temp);                vector<string> s;                s.push_back(strs[i]);                result.push_back(s);            }        }        return result;    }};

性能:

这里写图片描述

参考答案:

class Solution {public:    vector<vector<string>> groupAnagrams(vector<string>& strs) {        vector<vector<string>> result;        unordered_map<int, int> hashmap;        int idx = 0;        for(const string& s : strs) {            int hash = get_hash(s);            if(hashmap.find(hash) == hashmap.end()) {                hashmap[hash] = idx++;                result.push_back(vector<string>{s});            } else {                result[hashmap[hash]].push_back(s);            }        }        return result;    }private:    int get_hash(const string& s) {        const 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};        int a = 1;        for(char c : s) {            a *= prime[c - 'a'];        }        return a;    }};

性能:

这里写图片描述

原创粉丝点击