☆打卡算法☆LeetCode 49、字母异位词分组 算法解析

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: “给定一个字符串数组,返回 字母异位词 列表。”

一、题目


1、算法题目

“给定一个字符串数组,返回 字母异位词 列表。”

题目链接:

来源:力扣(LeetCode)

链接:49. 字母异位词分组 - 力扣(LeetCode) (leetcode-cn.com)


2、题目描述

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母都恰好只用一次。

示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
复制代码
示例 2:
输入: strs = ["a"]
输出: [["a"]]
复制代码


二、解题


1、思路分析

首先分析题意,字母异位词,是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母都恰好只用一次。

这就意味着新旧两个字符串互为字母异位词,因为两个字符串包含的字母相同,同一组字母异位词中的字符串具有相同点。

可以使用相同点作为一组字母异位词的标志,使用哈希表来保存每一组字母异位词,然后遍历每个字符串,得到该字符串中相同点,将当前字符串加入该字母异位词中,遍历完之后,哈希表中每个键值对应即为一组字母异位词。


2、代码实现

代码参考:

public class Solution {
    public IList<IList<string>> GroupAnagrams(string[] strs) {
            var dic = new Dictionary<string, IList<string>>();
            IList<IList<string>> res = new List<IList<string>>();
            for (int i = 0; i < strs.Length; i++)
            {
                char[] a = strs[i].ToArray();
                Array.Sort(a);
                string str = String.Join("", a.Select(x => x.ToString()).ToArray());
                if (dic.ContainsKey(str))
                {
                    dic[str].Add(strs[i]);
                }
                else
                {
                    dic[str] = new List<string> { strs[i] };
                }
            }
            foreach (var item in dic.Keys)
            {
                res.Add(dic[item]);
            }
            return res;
    }
}
复制代码

网络异常,图片无法展示
|


3、时间复杂度

时间复杂度 : O(nk log k)

其中n是字符串数组的数量,k是字符串数组中最长字符串的长度,需要遍历n个字符串,对于每个字符串需要O(k log k)的时间进行排序,以及O(1)的时间更新哈希表,所以总时间复杂度是O(nk log k)。

空间复杂度: O(nk)

其中n是字符串数组的数量,k是字符串数组中最长字符串的长度。


三、总结

总体思路就是使用字典,将相同点存入字典中,进行遍历。

在遍历过程中将 每个字符串进行排序比较,排序的字符串作为key值,Value为strs[i]。

遍历完数组,最后从字典中取值即可。



相关文章
|
1月前
|
负载均衡 算法 Java
Spring Cloud全解析:负载均衡算法
本文介绍了负载均衡的两种方式:集中式负载均衡和进程内负载均衡,以及常见的负载均衡算法,包括轮询、随机、源地址哈希、加权轮询、加权随机和最小连接数等方法,帮助读者更好地理解和应用负载均衡技术。
|
6天前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
26 0
|
7天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GA遗传优化的GroupCNN分组卷积网络时间序列预测算法matlab仿真
该算法结合了遗传算法(GA)与分组卷积神经网络(GroupCNN),利用GA优化GroupCNN的网络结构和超参数,提升时间序列预测精度与效率。遗传算法通过模拟自然选择过程中的选择、交叉和变异操作寻找最优解;分组卷积则有效减少了计算成本和参数数量。本项目使用MATLAB2022A实现,并提供完整代码及视频教程。注意:展示图含水印,完整程序运行无水印。
|
7天前
|
搜索推荐 Shell
解析排序算法:十大排序方法的工作原理与性能比较
解析排序算法:十大排序方法的工作原理与性能比较
25 9
|
1天前
|
存储
Leetcode第49题(字母异位词分组)
LeetCode第49题要求将字符串数组中的字母异位词分组,可以通过将每个字符串排序后作为键存入哈希表,最后将哈希表中的值添加到结果列表中来实现。
8 1
|
1天前
|
算法
Leetcode第十七题(电话号码的字母组合)
这篇文章介绍了如何使用深度优先搜索(DFS)算法来解决LeetCode第17题——电话号码的字母组合问题,通过递归方法生成所有可能的字母组合。
7 0
Leetcode第十七题(电话号码的字母组合)
|
1天前
|
索引
【LeetCode 11】242.有效的字母异位词
【LeetCode 11】242.有效的字母异位词
7 0
【LeetCode 11】242.有效的字母异位词
|
7天前
|
搜索推荐 算法 数据可视化
深入解析冒泡排序算法
深入解析冒泡排序算法
14 4
|
17天前
|
算法 调度
操作系统的心脏:深入解析进程调度算法
本文旨在深入探讨现代操作系统中的核心功能之一——进程调度。进程调度算法是操作系统用于分配CPU时间片给各个进程的机制,以确保系统资源的高效利用和公平分配。本文将详细介绍几种主要的进程调度算法,包括先来先服务(FCFS)、短作业优先(SJF)、时间片轮转(RR)以及优先级调度(PS)。我们将分析每种算法的基本原理、优缺点及其适用场景。同时,本文还将讨论多级反馈队列(MFQ)调度算法,并探讨这些算法在实际应用中的表现及未来发展趋势。通过深入解析这些内容,希望能够为读者提供对操作系统进程调度机制的全面理解。
|
3天前
|
存储 搜索推荐 算法
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析

推荐镜像

更多