字母异位词分组[中等]

优质博文:IT-BLOG-CN

一、题目

给你一个字符串数组,请你将字母异位词组合在一起。可以按任意顺序返回结果列表。字母异位词是由重新排列源单词的所有字母得到的一个新单词。

示例 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]仅包含小写字母

二、代码

【1】由于互为字母异位词的两个字符串包含的字母相同,因此两个字符串中的相同字母出现的次数一定是相同的,故可以将每个字母出现的次数使用字符串表示,作为哈希表的键。由于字符串只包含小写字母,因此对于每个字符串,可以使用长度为26的数组记录每个字母出现的次数。需要注意的是,在使用数组作为哈希表的键时,不同语言的支持程度不同,因此不同语言的实现方式也不同。

class Solution {public List<List<String>> groupAnagrams(String[] strs) {// 思想:将包含字母相同的字符串,想办法整合成相同的字符串作为key,然后从map中获取,并存入列表中Map<String, List<String>> map = new HashMap();for (int i = 0; i < strs.length; i++) {// 创建一个26位的数组,根据字母的asc码-`a`作为下标int[] words = new int[26];// 遍历字符串,并使用数组进行计数for (int j = 0; j < strs[i].length(); j++) {words[strs[i].charAt(j) - 'a']++;}// 根据下标整合keyString key = "";for(int j = 0; j < 26; j++) {if (words[j] > 0) {key += String.valueOf((char)('a' + j)) + words[j];}}List<String> wordList = map.getOrDefault(key, new ArrayList<String>());wordList.add(strs[i]);map.put(key, wordList);}return new ArrayList<List<String>>(map.values());}
}

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

空间复杂度: O(n(k+∣Σ∣)),其中nstrs中的字符串的数量,kstrs中的字符串的最大长度,Σ是字符集,在本题中字符集为所有小写字母,∣Σ∣=26。需要用哈希表存储全部字符串,而记录每个字符串中每个字母出现次数的数组需要的空间为O(∣Σ∣),在渐进意义下小于O(n(k+∣Σ∣)),可以忽略不计。

【2】排序: 由于互为字母异位词的两个字符串包含的字母相同,因此对两个字符串分别进行排序之后得到的字符串一定是相同的,故可以将排序之后的字符串作为哈希表的键。

class Solution {public List<List<String>> groupAnagrams(String[] strs) {// 思想:对字符串进行排序Map<String, List<String>> map = new HashMap();for (String str: strs) {// 对字符串进行排序【解题的重点】char[] chars = str.toCharArray();Arrays.sort(chars);String key = new String(chars);List<String> wordList = map.getOrDefault(key, new ArrayList<String>());wordList.add(str);map.put(key, wordList);}return new ArrayList<List<String>>(map.values());}
}

时间复杂度: O(nklog⁡k),其中nstrs中的字符串的数量,kstrs中的字符串的的最大长度。需要遍历n个字符串,对于每个字符串,需要O(klog⁡k)的时间进行排序以及O(1)的时间更新哈希表,因此总时间复杂度是O(nklog⁡k)
空间复杂度: O(nk),其中nstrs中的字符串的数量,kstrs中的字符串的的最大长度。需要用哈希表存储全部字符串。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/144845.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 泛型介绍

C# 中的泛型&#xff08;Generics&#xff09;是一种强类型参数化的特性&#xff0c;它允许你编写不具体指定数据类型的代码&#xff0c;而在实际使用时再指定具体的类型。泛型的引入使得代码更加灵活、可重用&#xff0c;并提高了类型安全性。 C#泛型基本用法 以下是一个简单…

【全网首发】【Python】Python控制parrot ARDrone 2.0无人机

&#x1f389;欢迎来到Python专栏~Python控制parrot ARDrone 2.0无人机 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;Python学习专栏 文章作者技术和水平有限&#xff0c;如果文中出现错误…

交换机聚合配置 (H3C)

交换机聚合配置 &#xff08;H3C&#xff09; 聚合是什么如何配置聚合 聚合是什么 链路聚合是将两个或更多数据信道结合成一个单个的信道&#xff0c;该信道以一个单个的更高带宽的逻辑链路出现。一般用来连接一个或多个带宽需求大的设备&#xff0c;例如连接骨干网络的服务器…

基于IDEA创建Maven工程及注意事项

Java全能学习面试指南&#xff1a;https://javaxiaobear.cn 1. 概念梳理Maven工程的GAVP Maven工程相对之前的项目&#xff0c;多出一组gavp属性&#xff0c;gav需要我们在创建项目的时候指定&#xff0c;p有默认值&#xff0c;我们先行了解下这组属性的含义&#xff1a; Ma…

java的Exception.getMessage为null

之前捕获异常后调用异常的getMessage写日志&#xff0c;日志写的竟然是null&#xff0c;不可思议。发现要调用异常的getCause().getMessage()才能得到异常信息 刻意把密码改错&#xff0c;让异常直达界面&#xff0c;免得有问题时候只能猜

LeetCode 面试题 16.22. 兰顿蚂蚁

文章目录 一、题目二、C# 题解 一、题目 一只蚂蚁坐在由白色和黑色方格构成的无限网格上。开始时&#xff0c;网格全白&#xff0c;蚂蚁面向右侧。每行走一步&#xff0c;蚂蚁执行以下操作。 (1) 如果在白色方格上&#xff0c;则翻转方格的颜色&#xff0c;向右(顺时针)转 90 度…

Linux Traefik工具Dashboard结合内网穿透实现远程访问

文章目录 前言1. Docker 部署 Trfɪk2. 本地访问traefik测试3. Linux 安装cpolar4. 配置Traefik公网访问地址5. 公网远程访问Traefik6. 固定Traefik公网地址 前言 Trfɪk 是一个云原生的新型的 HTTP 反向代理、负载均衡软件&#xff0c;能轻易的部署微服务。它支持多种后端 (D…

区域入侵AI算法如何应用在工地场景,保卫工地施工安全?

在工地、厂区等施工场所&#xff0c;安全保障是必不可少的&#xff0c;特别是在人工智能技术日益成熟的今天&#xff0c;如何利用旭帆科技AI智能视频中的区域入侵算法助力智慧工地、保障工地安全呢&#xff1f; 1、建筑物周界安全 TSINGSEE青犀区域入侵算法可以用于监控建筑物…

M系列 Mac安装配置Homebrew

目录 首先&#xff0c;验证电脑是否安装了Homebrew 1、打开终端输入以下指令&#xff1a; 2、如图所示&#xff0c;该电脑没有安装Homebrew &#xff0c;下面我们安装Homebrew 一、官网下载 &#xff08;不建议&#xff09; 1、我们打开官网&#xff1a;https://brew.sh/ …

Oracle 中排序碰到 null 值如何处理

一、前言 Oracle 在 Order by 时缺省认为null是最大值&#xff0c;所以如果是ASC升序则排在最后&#xff0c;DESC降序则排在最前。 二、使用nulls first 或者nulls last 语法 nulls first 和 nulls last 是Oracle Order by支持的语法。 如果Order by 中指定了表达式Nulls f…

MySql跨库跨表触发器

一、跨库触发器的概念 跨库触发器是指能在一个数据库中创建的触发器&#xff0c;但触发器的操作涉及到其他数据库中的表。这种触发器的存在可以帮助我们实现一些复杂的业务逻辑&#xff0c;比如在一个数据库中的表更新时&#xff0c;自动更新另一个数据库中的相关表。 二、创建…

QT Creator 正则替换功能

原有的代码&#xff1a; cout<<"11"<<11232<<"333"<<4444; 现在希望添加一个条件编译,变成这样&#xff1a; #ifdef __DEBUG__ cout<<"11"<<11232<<"333"<<4444; #endif 但是一个…

669.修剪二叉树

原题链接:669.修剪二叉树 全代码&#xff1a; class Solution { public:TreeNode* trimBST(TreeNode* root, int low, int high) {if (root nullptr ) return nullptr;if (root->val < low) {TreeNode* right trimBST(root->right, low, high); // 寻找符合区间[l…

用PHP使用API接口获取虾皮商品详情

作为一名程序员&#xff0c;我们常常需要与各种API接口打交道&#xff0c;以获取我们需要的数据。本文将向您展示如何使用PHP编程语言与虾皮的API接口进行交互&#xff0c;以获取虾皮商品详情。 一、准备工作 在开始编写代码之前&#xff0c;确保您已经完成了以下准备工作&am…

C++ 模板 (一)

1. 泛型编程 如何实现一个通用的交换函数呢&#xff1f; void Swap(int& left, int& right) { int temp left; left right; right temp; } void Swap(double& left, double& right) { double temp left; left right; right temp; } void Swap(char&…

1116中信笔试

1116中信笔试 int, Integer的区别&#xff0c;相等如何判断结果Java的异常处理数据库的事务操作Redis的基本数据类型问了HashMap底层实现TCP协议MySQL的隔离级别创建线程的几种方式双亲委派机制 &#xff0c;它的优点linux命令&#xff08;查看线程&#xff09; java和数据库ha…

【LeetCode刷题-滑动窗口】--567.字符串的排列

567.字符串的排列 方法&#xff1a;滑动窗口 由于排列不会改变字符串中每个字符的个数&#xff0c;所以只有当两个字符串每个字符的个数均相等时&#xff0c;才是另一个字符串的排列 根据这一性质&#xff0c;记s1的长度为n&#xff0c;遍历s2中的每个长度为n的子串&#xff…

【系统架构设计】计算机公共基础知识: 2 计算机系统基础知识

目录 一 计算机系统组成 二 操作系统 三 文件系统 四 系统性能 一 计算机系统组成

汇川伺服【选型目录】

sv680旗舰&#xff1a; 编码器位数&#xff1a;26bit 电机额定转速&#xff1a;3000r【3k】圈脉冲&#xff1a; sv670标准&#xff1a; 编码器位数&#xff1a;23bit【台达B3:23bit&#xff0c;台达A2&#xff1a;bit】 电机额定转速&#xff1a;3000r【3k】圈脉冲&#xff1…

【算法|动态规划 | 区间dp No.2】AcWing 1068.环形石子合并

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【AcWing算法提高学习专栏】【手撕算法系列专栏】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&a…