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)

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

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

相关推荐
YH552698420 小时前
GPT‑5.6 Sol 原本支持 1M 上下文,Codex 现已放开此前限制,如何看待这次调整?
java·jvm·人工智能·gpt·算法·chatgpt
吃着火锅x唱着歌21 小时前
Effective C++ 学习笔记 条款43 学习处理模板化基类内的名称
c++·笔记·学习
felixking1 天前
C++20 协程
开发语言·c++·协程
遥感知识服务1 天前
从局部阈值、双极化到暗地表剔除:NASA OPERA DSWx-S1全球动态水体算法拆解
大数据·人工智能·深度学习·神经网络·算法·机器学习
晚风醉蝶1 天前
1-13-TimSort
算法
ZJU_统一阿萨姆1 天前
【算子开发】算子融合与Softmax_LayerNorm实现
人工智能·算法·语言模型·硬件架构
小小龙学IT1 天前
FlatBuffers 深度解析:Google 开源零拷贝序列化库完全指南
c++·开源
叩码以求索1 天前
浅谈:前序遍历反转法求解N叉树的后序遍历
算法
wuminyu1 天前
JDK21中虚拟线程和FFM协同实现高并发源码剖析
java·linux·c语言·jvm·c++
SWAGGY..1 天前
【C++进阶】:(1)继承机制详解
java·jvm·c++