leetcode 49 字母异位词分组(哈希映射map)

给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”],
输出:
[
[“ate”,“eat”,“tea”],
[“nat”,“tan”],
[“bat”]
]
说明:
所有输入均为小写字母。
不考虑答案输出的顺序。
已知一组字符串,将所有由颠倒字母顺序而构成的字放到一起输出
某两个字符串字符字母相同就应该分为一组
思考:
如何建立哈希表,怎样设计哈希表的key与value,就可将各个字符数相同的字符映射到一起
哈希表以内部进行排序的各个单词为key,以字符串向量(vector< string>)为value,储存各个字符数量相同的字符串
算法思路1:
设置字符串到字符向量的哈希表anagram,遍历字符串向量strs中的单词strs[i]:
1)设置临时变量str = str[i],对str进行排序
2)若str未出现在anagram中,设置str到一个空字符串向量的映射
3)将strs[i]添加至字符串向量anagram[str]中
遍历哈希表anagram,将全部Key对应的value push至最终结果

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        map<string, vector<string>> anagram;
        vector<vector<string>> result;
        for (int i = 0; i < strs.size(); i++){
            string str = strs[i];
            sort(str.begin(), str.end());
            if (anagram.find(str) == anagram.end()){
                vector<string> item;
                anagram[str] = item;   //以排序后的strs[i]作为key
            }
            anagram[str].push_back(strs[i]);    //在对应的字符串向量中push结果
        }
        map<string, vector<string>>::iterator it;
        for (it = anagram.begin(); it != anagram.end(); it++){
            result.push_back((*it).second);
        }
        return result;
    }
};

哈希表以26个字母的字符数量(一个长度为26的vector,统计单词中各个字符的数量)为key,以向量字符串(vector< string>)为value,存储各个字符数量相同的字符串(anagram)
算法思路2:
设置字符串到字符向量的哈希表anagram,遍历字符串向量strs中的单词strs[i]:
1)统计strs[i]中的各个字符数量,存储至vec
2)若vec未出现在anagram中,设置一个vec到一个空字符串向量的映射
3)将strs[i]添加至字符串向量anagram[vec]中
遍历哈希表anagram,将全部Key对应的value push至最终结果

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        map<vector<int>, vector<string>> anagram;
        vector<vector<string>> result;
        for (int i = 0; i < strs.size(); i++){
            vector<int> vec;
            change_to_vector(strs[i], vec);
            if (anagram.find(vec) == anagram.end()){
                vector<string> item;
                anagram[vec] = item;   //以排序后的strs[i]作为key
            }
            anagram[vec].push_back(strs[i]);    //在对应的字符串向量中push结果
        }
        map<vector<int>, vector<string>>::iterator it;
        for (it = anagram.begin(); it != anagram.end(); it++){
            result.push_back((*it).second);
        }
        return result;
    }
private:
    //将字符串str中的各个字符数量进行统计,存储至vec
    void change_to_vector(string &str, vector<int> &vec){
        for (int i = 0; i < 26; i++){
            vec.push_back(0);
        }
        for (int i = 0; i < str.length(); i++){
            vec[str[i] - 'a']++;
        }
    }
};
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值