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)

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

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

相关推荐
happyprince1 小时前
篇1:整体观 · bitsandbytes项目全貌解读
人工智能·算法
青梅橘子皮2 小时前
STL---map/set... “家族“详解(从使用到底层)(1)
数据结构·算法
让学习成为一种生活方式2 小时前
DNA 甲基化综述(模式、调控与功能)--Current Opinion in Plant Biology
算法
笨鸟先飞的橘猫2 小时前
c++面向对象编程
开发语言·c++
啦啦啦啦啦zzzz2 小时前
设计模式:桥接模式和组合模式
c++·设计模式·组合模式·桥接模式
-森屿安年-2 小时前
647. 回文子串
c++·算法·动态规划
fpcc2 小时前
c++应用网络编程之十七WebSocket
网络·c++·websocket
haolin123.3 小时前
类和对象(下)
c语言·开发语言·c++
皓月斯语3 小时前
P5736 【深基7.例2】质数筛
c++·算法·题解