哈希表(字母异位次分组)(5)

https://blog.csdn.net/2601_95366422/article/details/159113241

上节课链接

一.题目

49. 字母异位词分组 - 力扣(LeetCode)

二.思路讲解

2.1 思路讲解

如果沿用之前判断两个字符串是否为字母异位词 的方法,需要逐个比较字符出现次数,但在本题中,字符串数组可能包含多达 10^4 个字符串,两两比较显然不可行。

因此,我们需要一种更高效的分组策略 。字母异位词的本质是由相同字符以不同顺序组成 ,那么如果我们能将每个字符串标准化为一种统一的形式,所有互为异位词的字符串就会变成相同的标准化字符串。

这个标准化操作就是排序 :对每个字符串的字符按字典序排序,排序后得到的字符串就是该组的唯一标识 。例如,"eat"、"tea"、"ate"排序后都变成 "aet"。这样,我们就可以利用一个哈希表,以排序后的字符串为键,将原字符串加入对应的值(一个列表)中。遍历完所有字符串后,哈希表中的所有值即为分组结果。

三.代码演示

cpp 复制代码
class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) 
    {
        unordered_map<string,vector<string>>hash;
        vector<vector<string>>ret;
        //1.遍历元素然后排序
        for(const auto& str : strs)
        {
            string tmp = str;
            sort(tmp.begin(),tmp.end());//排序
            hash[tmp].push_back(str);//把str给排一下序,相同的放一起,不过放的是原先的元素也就是没有排序的
        }
        //2.取出元素分组
        for(const auto& [x,y] : hash)
        {
            ret.push_back(y);
        }
        return ret;
    }
};

四.代码讲解

一、初始化哈希表

为了将互为字母异位词的字符串归类到一起,我们需要一个能够快速定位分组的结构。这里使用 unordered_map<string, vector<string>> 作为哈希表,其中键是字符串的排序后形式,值是一个列表,存放所有与该键对应的原始字符串。这样,所有排序后相同的字符串就会被自动归入同一个组。

二、遍历每个字符串并排序

遍历输入的字符串数组 strs,对于每一个字符串 str,执行以下操作:

  • 创建一个临时字符串 tmp 并将 str 复制给它(因为我们要排序,不能改变原字符串)。

  • tmp 进行排序,使用 sort(tmp.begin(), tmp.end())。排序后,所有字母异位词都会变成相同的字符串。例如,"eat"、"tea"、"ate" 排序后都变成 "aet"。

  • 以排序后的 tmp 作为键,在哈希表中找到对应的值(一个 vector<string>),然后将原始字符串 str 添加到该数组中。这里利用了 hash[tmp].push_back(str),如果该键不存在,会自动创建一个空数组。

三、提取分组结果

遍历完所有字符串后,哈希表中存储了若干键值对,每个键对应一组字母异位词。我们需要将这些值(即每组字符串的列表)收集起来,放入最终的结果 ret 中。使用范围 for 循环遍历哈希表,对于每一对 [x, y],将 y 添加到 ret 中。注意,这里 x 是排序后的字符串,我们不需要它,只需要值列表。

四、关键细节
  • 排序的作用:通过排序将字母异位词标准化为同一个字符串,从而作为哈希表的键,这是本解法的核心。
相关推荐
txzrxz4 小时前
动态规划——背包问题
算法·动态规划
Yingye Zhu(HPXXZYY)4 小时前
洛谷 P15553 [CCPC 2025 哈尔滨站] 液压机
算法
谭欣辰4 小时前
LCS(最长公共子序列)详解
开发语言·c++·算法
m0_629494734 小时前
LeetCode 热题 100-----17.缺失的第一个正数
数据结构·算法·leetcode
Cando学算法4 小时前
鸽笼原理(抽屉原理)
c++·算法·学习方法
Tisfy4 小时前
LeetCode 0796.旋转字符串:暴力模拟
算法·leetcode·题解·模拟·字符串匹配
BlockChain8885 小时前
AI+区块链深度探索:算法与账本的共生时代
人工智能·算法·区块链
生成论实验室5 小时前
《源·觉·知·行·事·物:生成论视域下的统一认知语法》第一章 源:不可言说的生成之源
人工智能·科技·算法·生活·创业创新
2zcode5 小时前
基于低光照增强与轻量型CNN道路实时识别算法研究(UI界面+数据集+训练代码)
人工智能·算法·cnn·低光照增强·自动驾驶技术
hnjzsyjyj5 小时前
洛谷 P1443:马的遍历 ← BFS
数据结构·bfs