【leetcode/哈希表】字母异位分组(哈希映射分组)

该博客探讨了如何使用哈希映射对字母异位词进行分组,通过将按升序排列的字符串作为键,以vector为value进行分组。文章提供了AC代码,并分享了优化思路,建议直接在返回结果集上操作,避免字符串副本的额外开销。还提到了使用sort方法和哈希表进行高效分组。
摘要由CSDN通过智能技术生成

问题描述:

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

示例:

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

说明:

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

基本思路:

以按照升序排列的字符串作为键。以vector类型作为value来进行分组。

AC代码:

class Solution {
public:
    string ChangeOrder(string str) {
    // 返回字符升序排序的字符串
      string res;
      map<char, int> hashmap;
      for (char ch : str) {
        ++hashmap[ch];
      }
      // 按照自然顺序遍历
      for (char ch = 'a'; ch <= 'z'; ++ch) {
        for (int i = 0; i < hashmap[ch]; ++i) {
          res += ch;
        } 
      }
      return res;
    }
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
      map<string, vector<string>> hashmap;
      for (string str : strs) {
        hashmap[ChangeOrder(str)].push_back(str);
      }
      vector<vector<string>> res;
      for (auto it = hashmap.begin(); it != hashmap.end(); ++it) {
        res.push_back(it->second);
      }
      return res;
    }
};

大牛的思路:

以上代码我们花了相当长的时间来传递字符串副本。

与其把所有结果保存在hashmap,再把结果逐一复制到vector中。

不如直接操作vector。hashmap中存放的就是与我们vector有关的信息。

(这里存放的是在vector的行数)

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        unordered_map<string,int>index;
        vector<vector<string>> result;
        for(auto i:strs)
        {
            //sort(i.begin();i.end());
            string tmp = i;
            sort(tmp.begin(),tmp.end());
            
            if(index.find(tmp)==index.end())
            {
                
                index.insert({tmp,(int)result.size()});
                result.push_back(vector<string>{i});
            }
            else
            {
                result[index[tmp]].push_back(i);
            }

        }
        return result;
    }
};

其他经验:

  1.  不妨直接在返回的结果集上进行操作,免得创建副本浪费时空间
  2. 我对字符串中各个字符的排序使用了计数排序的方法,其实我们用sort效率会更高。
  3. 我们可以使用hashmap来进行分组,其中的key就是我们组的标示。value就是组中的成员的集合
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值