字母异位词分组: 中等难度(设计hash键值)

题目:

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

示例:

输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]
说明:

所有输入均为小写字母。
不考虑答案输出的顺序。

思路:
分析题目含义:字母相同的即为一个类别,期望分到一个组中并在return vec中组成一个vec

如何实现辨别是否为同一组:使用sort,如果sort后是一样的,就是同一组
如何判别这一组是否已经存在了呢?:利用hash_map来记录每一个元素属于哪一组,如果是第一次出现的组别,val = 0;下一次出现新的组别val = 1…

代码:

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        
        int flag = 0;
        unordered_map<string, int> data_table;
        // ret[0].push_back("111");
        for(string str : strs)  // 第一次循环,将每个字符串排序后,统计各个字符串属于第几组,以flag记录
        {
            string temp_str = str;
            sort(str.begin(),str.end());
            if(data_table.count(str) <= 0){
                data_table[str] = flag;                
                flag++;      
            }
            data_table[temp_str] = data_table[str];  
        }
                
        vector<vector<string>> ret;
        // 初始化ret
        for(int i =0; i< flag;i++){
            vector<string> temp;
            ret.push_back(temp);
        }
        
        // 搞定ret
        for(string str : strs)
        {
            ret[data_table[str]].push_back(str);
        }

        return ret;
    }
};

优化思路:
能否将上面的几次循环合并呢?
注意: vector在没有初始化的时候,是不能直接访问索引的;
能否在第一次循环的过程中,直接将新出现的组别初始化,并添加到ret中呢?

优化代码:

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        
        int flag = 0;
        unordered_map<string, int> data_table;
        vector<vector<string>> ret;
        // ret[0].push_back("111");
        for(string str : strs)  // 第一次循环,将每个字符串排序后,统计各个字符串属于第几组,以flag记录
        {
            string Original_str = str;
            sort(str.begin(),str.end());
            
            if(data_table.count(str) <= 0){     // 如果是新出现的组别
                vector<string> temp_vec(1,Original_str);
                ret.push_back(temp_vec);
                data_table[str] = flag;                
                flag++;      
            }
            else {                              // 如果是原始的组别
                ret[data_table[str]].push_back(Original_str);
            }
             
        }
                

        // // 初始化ret
        // for(int i =0; i< flag;i++){
        //     vector<string> temp;
        //     ret.push_back(temp);
        // }
        
        // 搞定ret
        // for(string str : strs)
        // {
        //     ret[data_table[str]].push_back(str);
        // }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值