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

LeetCode 49 字母异位词分组

LeetCode 49 字母异位词分组

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/group-anagrams/description/

博主Github:https://github.com/GDUT-Rp/LeetCode

题目:

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

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

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

输入: strs = [""]
输出: [[""]]

示例 3:

输入: strs = ["a"]
输出: [["a"]]

提示:

  • 1 <= strs.length <= 104
  • 0 <= strs[i].length <= 100
  • strs[i] 仅包含小写字母

解题思路:

方法一:每个字符串排序,放到map里整理

对每个str进行排序,放到一个map<string, []string>里,这里的[]string就是答案了

Golang

func groupAnagrams(strs []string) [][]string {strMap := make(map[string][]string)// 逐个取出来然后排序for _, str := range strs {astr := sortString(str)if v, ok := strMap[astr]; ok {v = append(v, str)strMap[astr] = vcontinue}alist := make([]string, 0)alist = append(alist, str)strMap[astr] = alist}// mapvar allList [][]stringfor _, v := range strMap {allList = append(allList, v)}return allList
}func sortString(str string) string {var needSort []bytefor i:=0; i<len(str); i++ {needSort = append(needSort, str[i])}sort.SliceStable(needSort, func(i, j int) bool {return needSort[i] > needSort[j]})return string(needSort)
}

复杂度分析

时间复杂度: O ( n k log ⁡ k ) O(nk \log k) O(nklogk),其中 n 是 strs \textit{strs} strs 中的字符串的数量,k 是 strs \textit{strs} strs 中的字符串的的最大长度。需要遍历 n n n 个字符串,对于每个字符串,需要 O ( k log ⁡ k ) O(k \log k) O(klogk) 的时间进行排序以及 O ( 1 ) O(1) O(1) 的时间更新哈希表,因此总时间复杂度是 O ( n k log ⁡ k ) O(nk \log k) O(nklogk)

空间复杂度: O ( n k ) O(nk) O(nk),其中 n n n strs \textit{strs} strs 中的字符串的数量,k 是 strs \textit{strs} strs 中的字符串的的最大长度。需要用哈希表存储全部字符串。

在这里插入图片描述

方法二:技数

对每个字符串的字母取频数,cnt[26]作为key,进行统计整理 map<cnt[26], []string>

Golang

func groupAnagrams(strs []string) [][]string {cntMap := make(map[[26]int][]string)for _, str := range strs {cnt := [26]int{}for _, s := range str {cnt[s - 'a']++}cntMap[cnt] = append(cntMap[cnt], str)}var result [][]stringfor _, v := range cntMap {result = append(result, v)}return result
}

复杂度分析

时间复杂度: O ( n ( k + ∣ Σ ∣ ) ) O(n(k+|\Sigma|)) O(n(k+∣Σ∣)),其中 n 是 strs \textit{strs} strs 中的字符串的数量,k 是 strs \textit{strs} strs 中的字符串的的最大长度, Σ \Sigma Σ 是字符集,在本题中字符集为所有小写字母, ∣ Σ ∣ = 26 |\Sigma|=26 ∣Σ∣=26。需要遍历 n 个字符串,对于每个字符串,需要 O ( k ) O(k) O(k) 的时间计算每个字母出现的次数, O ( ∣ Σ ∣ ) O(|\Sigma|) O(∣Σ∣) 的时间生成哈希表的键,以及 O ( 1 ) O(1) O(1) 的时间更新哈希表,因此总时间复杂度是 O ( n ( k + ∣ Σ ∣ ) ) O(n(k+|\Sigma|)) O(n(k+∣Σ∣))

空间复杂度: O ( n ( k + ∣ Σ ∣ ) ) O(n(k+|\Sigma|)) O(n(k+∣Σ∣))

在这里插入图片描述

http://www.lryc.cn/news/89836.html

相关文章:

  • ( 链表) 142. 环形链表 II——【Leetcode每日一题】
  • 论文解读 | 基于改进点对特征的点云6D姿态估计
  • Shell脚本while循环语句应用
  • Kubernetes Dashboard + Ingress 及其 yaml 文件分析
  • 【SpringCloud组件——Nacos】
  • pinia状态管理 用法
  • Oracle客户端版本安装
  • 基于Android studio二手车交易系统app
  • 【LCD应用编程】绘制点、线、矩形框
  • 第八篇、基于Arduino uno,获取MAX30102心率传感器的心率信息——结果导向
  • 【MySQL】MySQL主从同步延迟原因与解决方案
  • 学C的第二十二天【深度剖析数据在内存中的存储:1. 数据类型介绍;2. 整型在内存中的存储】
  • 测试计划模板一
  • 【利用AI让知识体系化】5种创建型模式
  • Unity的UnityStats: 属性详解与实用案例
  • TDengine集群搭建
  • Android 12.0无源码apk设置默认启动Launcher的相关属性
  • js深拷贝和浅拷贝
  • CANopenNode Master 配置
  • HW之轻量级内网资产探测漏洞扫描工具
  • 算法练习-2:送外卖
  • 八股总结(六):Android基础:四大组件与UI控件
  • 【P46】JMeter 响应断言(Response Assertion)
  • 19-02 基于业务量级的架构技术选型演进
  • Server - 高性能的 PyTorch 训练环境配置 (PyTorch3D 和 FairScale)
  • 小猫踩球-第14届蓝桥杯省赛Scratch中级组真题第2题
  • 嵌入式开发从入门到精通之第二十一节:三轴加速度传感器(BMA250E)
  • 代码随想录算法训练营第三十六天|435. 无重叠区间 763.划分字母区间 56. 合并区间
  • shell 脚本
  • Linux :: 【基础指令篇 :: 用户管理(补充):(4)】::用户切换