LeetCode 热题 100——day2 字母异位词分组

✨ 把代码写进星轨,用逻辑丈量宇宙。

导航 链接
个人主页 🏠 星轨初途
基础语言专栏 💻 C语言、📚 数据结构
刷题实战专栏 🚀 算法及编程题分享、📝 力扣每日刷题分享

文章目录

LeetCode:字母异位词分组

题目思路

字母异位词虽然字符顺序不同,但将字符串排序后,结果一定相同。

例如:

text 复制代码
"eat" -> "aet"
"tea" -> "aet"
"ate" -> "aet"

因此,可以将排序后的字符串作为分组依据。


方法一:排序 + 哈希表

使用排序后的字符串作为哈希表的 key,原字符串保存到对应的 vector 中。

例如:

text 复制代码
"aet" -> ["eat", "tea", "ate"]
"ant" -> ["tan", "nat"]
"abt" -> ["bat"]

复杂度分析

设字符串数量为 N,每个字符串平均长度为 K。

  • 时间复杂度:O(N × KlogK);
  • 空间复杂度:O(N × K)。

代码实现

cpp 复制代码
class Solution
{
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs)
    {
        unordered_map<string, vector<string>> mp;
        for (string s : strs)
        {
            string key = s;
            sort(key.begin(), key.end());
            mp[key].push_back(s);
        }
        vector<vector<string>> ans;
        for (auto& p : mp)
        {
            ans.push_back(p.second);
        }
        return ans;
    }
};

方法二:排序 + 连续分组

将排序后的字符串和原字符串绑定在一起:

text 复制代码
pair<排序后的字符串, 原字符串>

然后对所有 pair 进行排序。

排序后,相同 key 的元素会连续排列,再依次完成分组。

复杂度分析

  • 字符串内部排序:O(N × KlogK);
  • 整体排序:O(NlogN × K);
  • 空间复杂度:O(N × K)。

代码实现

cpp 复制代码
class Solution
{
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs)
    {
        vector<pair<string, string>> temp;
        for (const string& s : strs)
        {
            string key = s;
            sort(key.begin(), key.end());

            temp.push_back({key, s});
        }
        sort(temp.begin(), temp.end());
        vector<vector<string>> ans;
        for (int i = 0; i < temp.size();)
        {
            int j = i;
            vector<string> group;
            while (j < temp.size() && temp[j].first == temp[i].first)
            {
                group.push_back(temp[j].second);
                ++j;
            }
            ans.push_back(group);
            i = j;
        }
        return ans;
    }
};

总结

方法 核心思路 时间复杂度 空间复杂度
排序 + 哈希表 排序结果作为 key,使用哈希表分组 O(N × KlogK) O(N × K)
排序 + 连续分组 保存 {key, 原字符串},整体排序后分组 O(NK(logK + logN)) O(N × K)

两种方法都利用了:字母异位词排序后结果相同

但哈希表方法代码更加简洁,也是这道题最常用的解法;整体排序方法则不需要使用哈希表。

相关推荐
AC赳赳老秦3 小时前
采集行为合规自检:OpenClaw 自动校验 robots 协议与采集频率,规避违规采集风险
java·开发语言·c++·python·php·deepseek·openclaw
无名猿3 小时前
C++ 查找算法:std::find 与容器成员 find 的性能差距
c++·性能优化·stl·标准库
程序猿编码4 小时前
工业视觉多任务方案:可编程梯度信息视觉框架,训练评估 + C++ 部署完整实战
开发语言·c++·视觉·推理引擎
朝朝辞暮i5 小时前
C++ 第 21 课:struct —— 把一组相关数据打包在一起
开发语言·c++·算法
青梅橘子皮5 小时前
Blue---二分算法(二分查找与二分答案)
算法
长河5 小时前
Java的GC(垃圾回收)中,标记无用对象的核心方法是可达性分析算法
java·jvm·算法
月光船幽幽6 小时前
加性偏移外推提升参数识别可靠性
python·算法
SHARK_pssm6 小时前
【C++——类和对象(下)】
开发语言·c++·经验分享·笔记
汉克老师6 小时前
GESP2026年9月认证C++二级( 第一部分选择题(1~7题)精讲
c++·gesp·小学生·学c++编程
Ivanqhz6 小时前
层归一化、残差、前馈网络与激活函数简述
服务器·数据库·人工智能·深度学习·算法