当前位置: 首页 > news >正文

LeetCode算法刷题——49. 字母异位词分组

一、题目描述

字母异位词:指字母相同,但排列不同的字符串。比如 "eat"、"tea"、"ate" 就是字母异位词。

目标:将字母异位词分组在一起。

二、解题思路

我们可以用字符计数的方法:

  • 使用26位数组统计每个单词的字母频次

  • 频次数组转换为字符串作为哈希表键

  • 原始单词存储为对应键的

  • 相同频次的单词自动归类到同一分组

三、完整代码

class Solution {

public:

    vector<vector<string>> groupAnagrams(vector<string>& strs) {

        unordered_map <string,vector<string>> map;

        for(string str:strs){

            int num[26]={0};

            for(char s:str){

                num[s-'a']++;

            }

            string key="";

            for(int i=0;i<26;i++){

                key=key+to_string(num[i])+",";

            }

            map[key].push_back(str);

        }

        vector<vector<string>> result;

        for(auto r:map){

            result.push_back(r.second);

        }

        return result;

    }

};

四、代码解析

1. 哈希表定义

unordered_map<string, vector<string>> map;

  • string:一个用于记录字幕出现频率的字符串

  • vector<string>(n个字符串):对应的字母异位词分组 

2. 字符计数

vector<int> count(26, 0);
for (char c : str) {
    count[c - 'a']++;
}

        创建26位数组,统计每个字母出现次数。

3. 生成键

for(int i=0;i<26;i++){

    key=key+to_string(num[i])+",";

}

        将计数数组转换为哈希表的键Key。

4. 分组存储

map[key].push_back(str);

        将当前字符串添加到对应分组。

5. 提取结果

vector<vector<string>> result;
for (auto& pair : map) {
    result.push_back(pair.second);
}

二维数组的结构:

  • 外层 vector 包含所有字母异位词分组

  • 每个内层 vector<string> 是一个具体的分组,包含所有互为字母异位词的字符串

        遍历哈希表时,会同时遍历键和值,pair.first=key , pair.second=value

        结果如下

result = [
    ["eat", "tea", "ate"],  // 第一个分组
    ["tan", "nat"],         // 第二个分组
    ["bat"]                 // 第三个分组
]

五、语法要点

1. vector使用

vector<string> array;        // 字符串数组
array.push_back(value);      // 添加元素
vector<int> count(26, 0);   // 创建26个0的数组

2. unordered_map使用

unordered_map<string, vector<string>> map;
map[key] = value;           // 设置键值对
map[key].push_back(value);  // 向值中添加元素

3. 范围循环

&的作用:

  • 不加 &:按值传递,每次循环都会创建元素的副本(性能差)

  • 加 &:按引用传递,直接操作原数据(性能好)

const的作用:

  • 不加 const:可以修改原数据

  • 加 const:只读访问,不能修改原数据

实际使用场景:

  • for (const auto& x : container):只读访问容器元素

  • for (auto& x : container):需要修改容器元素时使用

  • for (auto x : container):避免使用,性能差

六、执行示例

输入:["eat", "tea", "tan"]

  1. "eat" → 键:"1,0,0,0,1,0,..." → 分组:{"eat"}

  2. "tea" → 相同键 → 分组:{"eat", "tea"}

  3. "tan" → 新键 → 分组:{"tan"}

结果:[["eat","tea"],["tan"]]


总结

        本文介绍了将字母异位词分组的算法解决方案。通过统计每个单词的字母频次,将频次数组转换为字符串作为哈希表键,实现相同字母组成的单词自动归类。代码使用unordered_map存储分组,其中键为字母频次字符串,值为对应分组的单词集合。算法首先计算每个单词的26位字母计数,生成唯一键值,然后将单词存入对应分组,最后提取所有分组作为结果输出。该方法时间复杂度为O(n*m),其中n为单词数量,m为单词平均长度。

http://www.dtcms.com/a/592827.html

相关文章:

  • Spring Boot 常用注解全面解析:提升开发效率的利器
  • 《架构师修炼之路》——②对架构的基本认识
  • 基于GLM-4.6我做了一个智能口算天天练系统
  • 国外网站工作室自适应网站设计案例
  • 3.1 数据清洗与预处理
  • Docker 容器化部署 QINGLONG 面板指南
  • JQueryAjax
  • java格式化BigDecimal為#,###,##0.00
  • 增城建设网站济南seo排名优化推广
  • 用 Table ID 驯服异构库Flink CDC 跨系统表映射的工程化实践
  • 简洁大气的公司网站外包推广公司
  • MOSFET选型指南:为何ASIM阿赛姆是高效电源设计的优选
  • RV1126 NO.48:RV1126+OPENCV在视频中添加时间戳
  • Transformer实战(25)——自动超参数优化提升Transformer模型性能
  • 得实DS-300针式打印机使用连续纸打印完成后不能自动走到撕纸位置上怎么解决?
  • 大连网站建设在线win7如何做网站服务器
  • 怎样看一个网站做的网络广告郴州网络推广公司
  • 百度智能云 X 十字路口 | 对谈王雁鹏:亲述从大数据时代到 3 万卡集群的中国算力演进史
  • 初识MYSQL —— 索引
  • Blender快捷方式,自用Mark版
  • 移远 5G RG255AA-CN 调试
  • PyTorch3D从CUDA到CPU环境的完整迁移指南
  • 移动通信网络建设-实验2:5G站点选型与设备部署
  • 【自然语言处理】预训练06:子词嵌入
  • 地球的螺旋运动、四季轮回与椭圆轨道:统一场论下的宇宙新图景
  • html格式网站与网站开发有关的岗位是哪些
  • 底层视觉及图像增强-项目实践(十六-0-(6):线性映射技术在LED显示驱动中的工程实践与创新):从奥运大屏,到手机小屏,快来挖一挖里面都有什么
  • 2.7 模型评估与 A/B 测试
  • 政务终端一体化安全解决方案
  • 模板工程的建立