Leetcode算法——49、字符串分组(group anagrams)

49. Group Anagrams(字母异位词分组)两种解法(C++ & 注释) 49. Group Anagrams(字母异位词分组)1. 题目描述2. 哈希表(Hash Table)3. 质数相乘(Prime Multiplication)4. 实例代码5. 参考资料 1. 题目描述 给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。 示例: 输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 输出: [ [“ate”,“eat”,“tea”], [“nat”,“tan”], [“bat”] ] 阅读详情

给定一个字符串数组,将所有字符串分组,每一组的字符串包含的字符相同但是顺序不同。

示例:

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

思路

本文提出了 3 种解法,可以抽象出一个共同的思路:

都是定义了一种映射,将字符串映射到一个key,并保证同一组字符串映射到相同的key,不同组字符串映射到不同的key。

1、排序法

对每个字符串,先排序,然后作为 key,将原字符串加入到 key 对应的 value 中。

这样,不同字符顺序的字符串排序后 key 都相等,因此一个 key 对应的 value 自成一组。

示例:

‘aab’ -> ‘aab’
‘aba’ -> ‘aab’
key 相等,因此分到一组。

排序的算法复杂度为 O(nlogn),因此整体算法复杂度为 O(mnlogn)。

m为字符串个数,n为每个字符串的平均长度。

2、计数法

对每个字符串,对包含的字符的种类和个数进行统计,然后将同样记录结果的字符串聚集在一起。

可以用一个 26 位的字符串作为 key,代表 26 个字母的个数。

示例:

‘aab’ -> ‘21000000000000000000000000’
‘aba’ -> ‘21000000000000000000000000’
key 相等,因此分到一组。

相当于也是用了排序法,只不过是桶排序,算法复杂度为O(n),因此整体算法复杂度为O(mn)。

3、累乘法

将字符串中每个字符对应素数的累乘,将结果作为 key。

26 个字母对应的素数可以是任意的,只要互不相同即可,如:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101]

示例:

‘aab’ -> 223=12
‘aba’ -> 232=12
key 相等,因此分到一组。

缺点:乘积结果与字符串长度成指数增长,容易数据溢出。

整体算法复杂度为O(mn)。

python实现

def groupAnagrams(strs):
    """
    :type strs: List[str]
    :rtype: List[List[str]]
    排序法。
    """
    dic = dict()
    for s in strs:
        key = str(sorted(s))
        dic[key] = dic.get(key, []) + [s]
    return list(dic.values())

def groupAnagrams2(strs):
    """
    :type strs: List[str]
    :rtype: List[List[str]]
    计数法。
    """
    dic = dict()
    for s in strs:
        l = [0] * 26 # 26个字母的计数
        for char in s:
            l[ord(char) - ord('a')] += 1
        key = str(l)
        dic[key] = dic.get(key, []) + [s]
    return list(dic.values())

from functools import reduce 
def groupAnagrams3(strs):
    """
    :type strs: List[str]
    :rtype: List[List[str]]
    累乘法。
    """
    prime_list = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101]
    dic = dict()
    for s in strs:
        if s:
            char_to_primes = [prime_list[ord(char) - ord('a')] for char in s]
            key = reduce(lambda x,y : x*y, char_to_primes)
        else:
            key = 0
        dic[key] = dic.get(key, []) + [s]
    return list(dic.values())

if '__main__' == __name__:
    strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
    print(groupAnagrams3(strs))
单细胞实战之亚细胞分群从T/NK至CD4+T细胞——从入门到进阶(中级篇1) 亚细胞分群从T/NK至CD4+T细胞 阅读详情

相关推荐

Vivaldi天线HFSS建模实战:从参数化曲线到辐射优化的完整流程

本文详细介绍了Vivaldi天线在HFSS中的建模与优化全流程,涵盖参数化曲线绘制、馈电系统设计及性能验证等关键步骤。通过实战案例分享,帮助工程师掌握超宽带天线的HFSS建模技巧,提升雷达探测和通信系统设计效率。重点解析了指数渐变曲线建模、微带馈电优化等核心技术要点。

weixin_29228781的博客 274

Leetcode_C++笔记之49. Group Anagrams(组类似)

defaultdict是Python内建字典类(dict)的一个子类,它重写了方法_missing_(key),增加了一个可写的实例变量default_factory,实例变量default_factory被missing()方法使用,如果该变量存在,则用以初始化构造器,如果没有,则为None。但在 Python 3.x 中,它们的返回值并不是我们常见的列表或者元组类型,因为 Python 3.x 不希望用户直接操作这几个方法的返回值。items() 用于返回字典中所有的键值对(key-value)。

JayShaun的博客 1125

保姆级拆解:HP 1312NF/CM1415打印机进纸离合器清洁与更换全记录(附B站/油管视频指路)

本文详细记录了HP 1312NF打印机进纸离合器故障的诊断与修复全过程,包括故障判断、工具准备、拆解步骤、清洁更换技巧及预防措施。特别针对离合器内部海绵老化粘连问题,提供了电工胶布和硬纸片两种实用替代方案,并附有B站/油管视频指路,帮助用户轻松完成打印机维修。

weixin_31102231的博客 376

leetcode 2157 — 字符串分组

leetcode 2157 — 字符串分组一、题目描述二、思路分析三、实现1、并查集(1)等价类 一、题目描述 二、思路分析 这里需要注意题目里给出的要求:在任意一个子串中,每个字母最多只出现一次。这就提示我们使用26位二进制数来表示每一个字符串以及与它相关联的字符串。 那么怎么得到一个数所有相关联的字符串呢?这里主要就是借助位运算: 添加或者删除一个字符串可以认为是对某一位取反; 替换一个字符串相当于任取一个0和一个1的位,取反。 三、实现 我们可以选择将所有字符串构成图,借助广度优先搜索找到所有关联集

coding-hwz 526

通讯接口应用笔记3:使用W5500实现Modbus TCP服务器

  前面我们设计实现了W5500的驱动程序,也讲解了驱动的使用方式。在最近一次的项目应用中,正好有一个使用W5500实现TCP通讯的需求,所以我们就使用该驱动程序轻松实现。这一篇中我们就来说一说基于我们W5500通讯驱动程序实现TCP通讯的过程。 1、应用需求   在本次应用中,要求实现一个基于W5500的Modbus TCP服务器。这个需求的描述虽然只有一句话,但是这个需求的内容可不简单。我们首先来分析一下这个需求的具体内容。   为了实现基于W5500的Modbus TCP服务器,我们必先须基于W550

木南创智 5500

移动端抓包实战指南:从HTTPS解密到QUIC协议与证书绑定破解

HTTPS作为保障网络通信安全的核心协议,其工作原理基于TLS/SSL加密与证书信任链验证。在移动应用开发与测试中,抓包是调试接口、分析性能、排查问题的关键技术手段。然而,随着移动端安全性的提升,传统的代理抓包方法常因证书绑定、HTTP/3/QUIC协议等挑战而失效。这要求开发者掌握分层诊断思维,协同使用代理工具、协议分析工具及底层流量捕获工具。例如,面对证书绑定导致的流量不可见,需借助Wireshark进行协议层分析;针对基于UDP的QUIC协议,则需使用支持该协议的抓包工具或临时禁用特性。本文聚焦移动端

weixin_27722377的博客 298

字符串分组-算法题

我的博客 1126

一文解释电路中常用电子元器件应用和选型01

电容和二极管是电路中最常用的两个电子元器件,种类和系列众多,这里简单总结一下应用场景和选型方式 电容(Capacitor) 电容的种类(20种以上)和应用非常广泛,但是我经常遇到的无非就是下面这几种: 应用 1.隔直流。 2.旁路(去耦) 3.耦合 4.滤波 5.温度补偿 6.计时 7.调谐 8.整流 9.储能 种类 1. 陶瓷电容 2. 云母电容 3. 铝电解电容 4. 钽

weixin_43904073的博客 2237

JAVA经典面试题之 实现字符串分组

实现字符串分组将一个字符串数组进行分组输出,每组中的字符串都由相同的字符组成。

astor722的博客 715

【产品】 产品设计:ID设计和MD设计详解

1、ID(Industry Design)工业设计 包含外观、材质、手感、颜色配搭,主要界面的实现与及色彩等方面的设计。 2、MD(Mechanical Design)结构设计 以手机为例: 前壳、后壳、手机的摄像镜头位置的选择、固定的方式、电池如何连接和手机的厚薄程度等。 如果是滑盖手机,如何让手机滑上去,怎样实现自动往上弹,SIM卡怎样插和拔的安排,这些都是手机结构设计的范畴。 繁...

产品线负责人 3万+

vue3+vite:引入tailwindcss不生效的原因,详细解决Tailwind配置没问题但就是不生效的情况,配置正确无报错但样式没有生效(包括tailwindcss在Vue2使用不生效解决方案)

vue3 tailwind使用教程以及tailwind不生效的问题,vue3+vite引入tailwindcss不生效的原因,tailwindcss配之后不生效怎么办,如何解决tailwinscss不生效的原因,Vue3项目使用tailwindcss在Vue2使用,不生效解决,如何解决使用 Tailwind CSS 后出现的样式不生效的问题?tailwindcss配之后不生效 tailwindcss不生效,为什么我的 Tailwind css 类没生效,解决使用 Tailwind 时样式不生效的问题,配置没

✅ 精选推荐文章 4128

LeetCode 49. Group Anagrams(哈希)

题目来源:https://leetcode.com/problems/group-anagrams/ 问题描述 49.Group Anagrams Medium 1483103FavoriteShare Given an array of strings, group anagrams together. Example: Input: ["eat", "tea", "tan", ...

da_kao_la的博客 303

置顶必读(2) |《滚雪球学数学建模》专栏目录 & 历年国赛/美赛真题库 & 真题解析(持续更新中)

本专栏《滚雪球学数学建模》采用“从零开始、逐步滚雪球”的学习路径,把数学建模的基础理论、方法工具与大量实战真题(尤其是国赛题,涵盖2025-1992所有真题)有机融合,形成一套系统化训练路线。非常适合零基础入门、希望提升模型与工程化能力的本科/研究生,以及备战全国大学生数学建模竞赛(国赛/省赛)的同学。加油,我们一起把建模能力打造成可迁移的核心竞争力!

**My Coding Family** 26万+

[LeetCode] Group Anagrams

https://leetcode.com/problems/anagrams/ 对每个string求个“hash”,存入hash table,对应的value是group的id。每遇到一个string,用同样的方法计算hash,如果出现过,就加入相应的group;否则,就加入hash table并新开一个group /* * author : TK * date : 2017...

Sari_2015的博客 183

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

[leetcode] 49. Group Anagrams

Description Given an array of strings, group anagrams together. 字母异位词分组的Python和C++代码实现。

Learning from the mistakes 180

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

LeetCode 49. Group Anagrams 题解

本题是字符串处理和哈希表的经典应用。字母异位词的特征:排序后相同哈希表分组优化:使用字符计数作为键通过本题可以深入理解哈希表在分组问题中的应用。

cannonjinx的博客 3809

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

leetcode 49. Group Anagrams

leetcode  49. Group Anagrams 很久·没刷leetcode,逐渐手生了。 下面的代码不知道为何不能acc 错误为: public class Solution { Set genCharSet(String s){ Set res = new HashSet(); for(int i=0;i<s.length();i++){

独钓寒江雪 611

[leetcode] 49. Group Anagrams 解题报告

题目链接:https://leetcode.com/problems/anagrams/ Given an array of strings, group anagrams together. For example, given: ["eat", "tea", "tan", "ate", "nat", "bat"],  Return: [ ["ate", "eat","t

小榕流光的专栏 2374

LeetCode49——Group Anagrams

LeetCode49——Group Anagrams 题意: 给定一组string,将这些string分类,同一类string满足如下条件: 1.在同类内部,按照字典序排列。 2.不同类的string所包含的字母不一样。 那么思路就是,首先区分,然后排序。 要做到区分很简单,首先对于不同类来说,他们包含的字母肯定不一样,那么将每个string进行排序(sort方法即可),就实现

上善若水 1228

Leetcode 49. Group Anagrams 字母异位词分组

Leetcode 49. Group Anagrams 字母异位词分组 标签: Leetcode 题目地址:https://leetcode-cn.com/problems/group-anagrams/ 题目描述 给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。 示例: 输入: ["eat", "tea", "tan", "ate", "nat", "ba...

CoderWangSon 346

【leetcode】【medium】49. Group Anagrams

49.Group Anagrams Given an array of strings, group anagrams together. Example: Input: ["eat", "tea", "tan", "ate", "nat", "bat"], Output: [ ["ate","eat","tea"], ["nat","tan"], ["bat"] ] No...

lemonade13的博客 150

LeetCode49- 字母异位词分组(Group Anagrams)

LeetCode49- 字母异位词分组(Group Anagrams) 最近全国疫情严重,待在家里没事干,马上又要准备春招了,最近刷刷题,记录一下!再说一句,武汉加油,大家出门记得戴口罩! 1、题目 给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。 示例: 输入: ["eat", "tea", "tan", "ate", "nat", "bat"], 输出: ...

sk18192449347的博客 231

LeetCode第49题思悟——字母异位词分组(group-anagrams)

LeetCode第49题思悟——字母异位词分组(group-anagrams) 知识点预告 字符串特征值的构建; HashMap的分类作用; 题目要求 给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/group-anagrams 著作权归领扣网络所有...

博采众长,自成一派; 391

leetcode:(49) Group Anagrams(java)

题目:       Given an array of strings, group anagrams together. Example: Input: ["eat", "tea", "tan", "ate", "nat", "bat"]Output: [ ["ate","eat","tea"], [&quot

Sunshine_liang1的博客 310

LeetCode | # 49. Group Anagrams

49. Group Anagrams Description 描述:https://leetcode.com/problems/group-anagrams/description/ 题意:将字符串按照组成的字母相同进行分类。 Solution: (Java) class Solution { public List<List<String>> groupAnagr...

Karmen199x的博客 253

【小白爬Leetcode49】7.1 字母异位词分组 Group Anagrams

【小白爬Leetcode49】7.1 字母异位词分组 Group Anagrams题目Discription思路一 给str排序思路二 用vector当作key Leetcode 315 medium\color{#FF4500}{medium}medium 点击进入原题链接:字母异位词分组 Group Anagrams 题目 Discription Given an array of strings, group anagrams together. Notes All inputs will b

weixin_41604040的博客 308
上一篇: Leetcode算法——48、全排列II
下一篇: Leetcode算法——50、实现乘方运算
HappyRocking
博客等级 码龄12年 222粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值