Leetcode 每日一题 49.字母异位词分组

ops/2024/12/28 5:12:32/

目录

问题描述

示例

示例 1

示例 2

示例 3

约束条件

解决方案

思路

算法步骤

过题图片

代码实现

复杂度分析

题目链接

结论


问题描述

给定一个字符串数组,需要将其中的字母异位词分组。字母异位词是指通过重新排列源单词的所有字母得到的新单词。要求可以按任意顺序返回结果列表。

示例

示例 1

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

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

示例 2

输入: strs = [""]

输出: [[""]]

示例 3

输入: strs = ["a"]

输出: [["a"]]

约束条件

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

解决方案

思路

解决这个问题的关键在于识别哪些字符串是字母异位词。由于字母异位词的字母种类和数量完全相同,我们可以通过对字符串中的字母进行排序,然后比较排序后的字符串是否相同来判断两个字符串是否为字母异位词。

算法步骤

  1. 创建一个空的Map,用于存储排序后的字符串和对应的原始字符串列表。
  2. 遍历输入的字符串数组strs
  3. 对于每个字符串,将其转换为字符数组,并进行排序。
  4. 将排序后的字符数组转换回字符串。
  5. 检查Map中是否已经存在这个排序后的字符串作为键,如果存在,则将原始字符串添加到对应的列表中;如果不存在,则创建一个新的列表,并将原始字符串添加进去。
  6. 将这个列表与排序后的字符串作为键一起存入Map
  7. 最后,将Map中的所有值(即所有分组好的列表)放入一个新的列表中,并返回。

过题图片

代码实现

 

java

import java.util.*;class Solution {public List<List<String>> groupAnagrams(String[] strs) {Map<String, List<String>> map = new HashMap<>();for (String str : strs) {char[] array = str.toCharArray();Arrays.sort(array);String sortedStr = new String(array); // 获取排序后的字符串List<String> tempList = map.getOrDefault(sortedStr, new ArrayList<>());tempList.add(str); // 将排序后相等的字符串存入一个集合map.put(sortedStr, tempList); // 将该字符串存入以 “sortedStr”为key,list为value的map键值对中}return new ArrayList<>(map.values()); // 返回所有分组好的列表}
}

复杂度分析

  • 时间复杂度:O(n * k * log(k)),其中n是字符串数组的长度,k是字符串的最大长度。这是因为我们需要对每个字符串进行排序,而排序的时间复杂度是O(k * log(k))。
  • 空间复杂度:O(n * k),因为我们需要存储所有字符串的排序版本和原始字符串。

题目链接

49. 字母异位词分组 - 力扣(LeetCode)

结论

通过将每个字符串的字母排序,我们可以有效地识别并分组字母异位词。字符串的排序是基于字符的Unicode值进行的,这意味着字符串会按照从第一个字符开始的字典顺序进行排序。如果第一个字符相同,则比较第二个字符,依此类推。


http://www.ppmy.cn/ops/139601.html

相关文章

【技巧】Mac上如何显示键盘和鼠标操作

在制作视频教程时&#xff0c;将键盘和鼠标的操作在屏幕上显示出来&#xff0c;会帮助观众更容易地理解。 推荐Mac上两款开源的小软件。 1. KeyCastr 这款工具从2009年至今一直在更新中。 https://github.com/keycastr/keycastr 安装的话&#xff0c;可以从Github上下载最…

MATLAB在生态环境数据处理与分析中的应用

专题一 MATLAB编程入门 要点&#xff1a;介绍、案例演示、软件界面、语法基础、基本运算等 专题二&#xff08;试听&#xff09; MATLAB编程入门 要点&#xff1a;脚本编写、函数调用、循环控制、代码调试、文件读写等 专题三 MATLAB可视化与绘图 要点&#xff1a;交互式…

【Android】从事件分发开始:原理解析如何解决滑动冲突

【Android】从事件分发开始&#xff1a;原理解析如何解决滑动冲突 文章目录 【Android】从事件分发开始&#xff1a;原理解析如何解决滑动冲突Activity层级结构浅析Activity的setContentView源码浅析AppCompatActivity的setContentView源码 触控三分显纷争&#xff0c;滑动冲突…

(译)提示词工程指南:如何写出让AI更听话的提示词(Prompt)?| 附完整示例和小学生版本

LLM Prompt Tuning Playbook 来源&#xff1a;https://github.com/varungodbole/prompt-tuning-playbook/blob/main/README.md 作者&#xff1a;Varun Godbole, Ellie Pavlick 以下内容引用自网络&#xff1b;使用Google Gemini 1.5pro 翻译。 目录 本文档的目标读者是谁&…

android项目启动中遇到的相关问题,后续会慢慢补充

近期遇到的问题 ——————————————————————1———————————————————————— 现象&#xff1a;打包成功安装到模拟器&#xff0c;但是点击App&#xff0c;直接闪退&#xff0c; 排查&#xff1a;打开Android Studio错误提示为&#xff1…

容器镜像仓库

文章目录 1、docker hub1_注册2_登录3_创建容器镜像仓库4_在本地登录Docker Hub5_上传容器镜像6_下载容器镜像 2、harbor1_获取 docker compose二进制文件2_获取harbor安装文件3_获取TLS文件4_修改配置文件5_执行预备脚本6_执行安装脚本7_验证运行情况8_访问harborUI界面9_harb…

数组常见查找算法

文章目录 时间复杂度1. 顺序查找&#xff08;Linear Search&#xff09;2. 二分查找&#xff08;Binary Search&#xff09;3. 插值查找&#xff08;Interpolation Search&#xff09;4.分块查找5.哈希查找 时间复杂度 衡量算法执行时间随输入规模增长而增长的速度的一个概念。…

MySQL悲观锁和乐观锁

MySQL悲观锁和乐观锁 在数据库中&#xff0c;锁是用来管理并发控制的一种机制&#xff0c;确保数据的一致性和完整性。MySQL中的悲观锁和乐观锁是两种不同的并发控制策略&#xff0c;它们在处理并发事务时采用不同的方法。 悲观锁&#xff08;Pessimistic Locking&#xff09…