leecode第四十九题(字母异位词分组)

本文介绍了一种使用排序和哈希映射的方法来解决分组同字母异序词的问题。通过复制并排序输入字符串数组中的每个字符串,然后利用哈希映射将相同排序结果的字符串分组。这种方法有效地解决了问题,且易于理解和实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        vector<vector<string>> result;
        int len=strs.size();
        
        vector<string> strs_copy=strs;//复制原数组,并对其中每个字符串排序
        for(int i=0;i<len;i++)
            sort(strs_copy[i].begin(), strs_copy[i].end());
        
        map<string,int> temp;//建立一个map
        int temp_num=0;
        for(int i=0;i<len;i++)
        {
            map<string,int>::iterator it;
            it=temp.find(strs_copy[i]);//检查每一个排序后的字符串
            if(it==temp.end())//如果没有查到,就在map里插入,并给出标记序号temp_num
            {
                temp.insert(make_pair(strs_copy[i],temp_num));
                temp_num++;
                vector<string> tt;
                tt.push_back(strs[i]);
                result.push_back(tt);
            }
            else//如果查到了,就直接push进去
                result[it->second].push_back(strs[i]);
        }
        return result;
    }
};

分析:

最终还是用到了排序。

转载于:https://www.cnblogs.com/CJT-blog/p/11211990.html

### 实现字母异位词分组 为了实现在 JavaScript 中解决 LeetCode 上的字母异位词分组,可以采用哈希表的方法来高效处理这个问。该算法的核心在于通过某种方式将具有相同字符组成的字符串映射到同一个键上。 #### 使用排序作为键的方式 一种直观的做法是对每个单词内部的字符进行排序,这样所有由相同字符构成的不同排列都会得到相同的有序形式。然后利用这个有序后的字符串作为哈希表中的键,原始字符串则被加入对应的值列表中。 ```javascript var groupAnagrams = function(strs) { const map = new Map(); for (const str of strs) { // 将当前字符串转成数组并排序后再变回字符串 const sortedStr = [...str].sort().join(''); if (!map.has(sortedStr)) { map.set(sortedStr, []); } map.get(sortedStr).push(str); } return Array.from(map.values()); }; ``` 这种方法的时间复杂度主要取决于两个方面:一是遍历输入字符串数组所需 O(n),二是对每一个字符串执行排序操作所需的平均时间开销大约为 O(k log k),其中 n 表示输入字符串的数量,k 则代表单个字符串的最大长度[^2]。 #### 基于计数器构建唯一标识符 另一种更高效的策略是创建一个固定大小(即英文字母数量)的频率向量或对象用于记录各个字符出现次数,并以此为基础构造唯一的签名串作为哈希表的关键字。这种方式避免了显式的排序过程,在某些情况下可能会带来性能上的优势。 ```javascript function getCharCountArray(string){ const charCounts = {}; string.split('').forEach(char => { if(!charCounts[char]) charCounts[char]=0; charCounts[char]++; }); return JSON.stringify(Object.entries(charCounts)); } var groupAnagrams = function(strs) { const anagramsMap = {}; strs.forEach((word)=>{ const key=getCharCountArray(word); if(anagramsMap[key]){ anagramsMap[key].push(word); }else{ anagramsMap[key]=[word]; } }); return Object.values(anagramsMap); } ``` 此方法同样依赖于一次完整的数据扫描以及针对每项元素的操作;然而由于不再涉及昂贵的比较交换运算,整体效率通常会有所提升。不过需要注意的是当涉及到非ASCII范围内的特殊字符时可能需要额外考虑如何适配Unicode标准下的多字节情况[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值