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

【力扣Hot100详解】解锁“字母异位词分组”:用排序魔法一键通关力扣!

字母异位词分组,力扣第49题,看似是“找不同”的排列游戏,实则是哈希表与字符串处理的经典结合。这道题就像是一把钥匙,能帮你打开“如何高效归类数据”的算法大门。今天,我们就用 Java 带你用“排序魔法”轻松破解它!


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

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 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. “字符排序”魔法:将每个字符串的字符排序,得到一个“标准形态”(例如 "eat" → "aet")。

  2. 哈希表映射:以“标准形态”为键,原字符串为值存入哈希表,自动完成分组。

  3. 一键收割:最终取出哈希表的所有值,就是分组结果。


代码实现:简洁才是终极优雅!

class Solution {public List<List<String>> groupAnagrams(String[] strs) {Map<String, List<String>> map = new HashMap<>();for (String str : strs) {// Step 1: 将字符串转为字符数组并排序,得到“标准形态”char[] array = str.toCharArray();Arrays.sort(array);String key = new String(array);// Step 2: 将当前字符串加入对应的分组列表List<String> list = map.getOrDefault(key, new ArrayList<>());list.add(str);map.put(key, list);}// Step 3: 收割所有分组结果return new ArrayList<>(map.values());}
}
代码逐行解析
  • 字符排序魔法Arrays.sort(array) 将字符串字符按字典序排列,确保异位词得到相同的键。

  • 哈希表操作

    • getOrDefault(key, new ArrayList<>()):若键存在,获取对应列表;否则新建空列表。

    • map.put(key, list):更新哈希表,保证列表始终最新。

  • 结果收割map.values() 直接获取所有分组,转换为 ArrayList 返回。


复杂度分析

  • 时间复杂度O(n * k log k)

    • n 是字符串数量,k 是字符串最大长度。

    • 每个字符串需排序(O(k log k)),总时间 O(n * k log k)

  • 空间复杂度O(n * k)

    • 哈希表存储所有字符串的副本。


进阶思考:不用排序,还能怎么玩?

除了排序法,还可以用字符计数法

  • 统计每个字符串中字符的出现次数,将计数结果(如 a1b0c2...)作为哈希表的键。

  • 但代码稍复杂,且效率不一定更高(尤其当字符串较长时)。

为什么本题推荐排序法?

  • 代码简洁直观,Java中字符串排序API非常高效。

  • 对中等长度的字符串,排序法和计数法性能差异不大。


总结

字母异位词分组的解题精髓在于:

  1. 找到同一类元素的唯一标识(排序后的字符串)。

  2. 哈希表的灵活运用,将分类问题转化为键值映射。

掌握这道题,你不仅学会了如何“归类数据”,更重要的是理解了**“空间换时间”**这一经典算法思想。下次遇到类似问题(如分组、去重),不妨想想:能不能造一个“魔法键”来一键解决?

相关文章:

【力扣Hot100详解】解锁“字母异位词分组”:用排序魔法一键通关力扣!

字母异位词分组&#xff0c;力扣第49题&#xff0c;看似是“找不同”的排列游戏&#xff0c;实则是哈希表与字符串处理的经典结合。这道题就像是一把钥匙&#xff0c;能帮你打开“如何高效归类数据”的算法大门。今天&#xff0c;我们就用 Java 带你用“排序魔法”轻松破解它&a…...

vite配置scss全局变量

vite配置scss全局变量 创建单独文件variable.scss在其中定义变量 vite.config.ts中配置 import { defineConfig } from vite import vue from vitejs/plugin-vue import path from path// https://vite.dev/config/ export default defineConfig({plugins: [vue()],resolve:…...

Spring Boot01(注解、)---java八股

Spring Boot中常用注解及其底层实现 1、SpringBootApplication注解&#xff1a; SpringBootApplication注解&#xff1a;这个注解标识了一个SpringBoot工程&#xff0c;它实际上是另外三个注解的组合&#xff0c;这三个注解是&#xff1a; aSpringBootConfiguration&#xff1a…...

2.19学习记录

Web easyupload3.0 这是一道构造.htaccess文件的传马 如下&#xff1a; <FilesMatch "jpg">SetHandler application/x-httpd-php </FilesMatch>.htaccess文件可以作为一个解释器&#xff0c;可以将传进去的图片马改为php马上传之后再传个图片马&#…...

汽车免拆诊断案例 | 2013 款奔驰 S300L 车起步时车身明显抖动

故障现象  一辆2013款奔驰S300L车&#xff0c;搭载272 946发动机&#xff0c;累计行驶里程约为15万km。车主反映&#xff0c;将挡位置于D挡&#xff0c;稍微释放一点制动踏板&#xff0c;车辆蠕动时车身明显抖动&#xff0c;类似气缸失火时的抖动&#xff0c;又类似手动变速器…...

【HeadFirst系列之HeadFirst设计模式】第5天之工厂模式:比萨店的秘密武器,轻松搞定对象创建!

工厂模式&#xff1a;比萨店的秘密武器&#xff0c;轻松搞定对象创建&#xff01; 大家好&#xff0c;今天我们来聊聊设计模式中的工厂模式。如果你曾经为对象的创建感到头疼&#xff0c;或者觉得代码中到处都是 new 关键字&#xff0c;那么工厂模式就是你的救星&#xff01;本…...

Redis如何解决热Key问题

目录 **如何解决 Redis 的热 Key&#xff08;Hot Key&#xff09;问题&#xff1f;****解决方案** **1. 使用多级缓存****方案** **2. 进行 Key 预分片&#xff08;Key Sharding&#xff09;****方案** **3. 使用 Redis 复制机制&#xff08;主从复制或集群&#xff09;****方案…...

从开发到部署:EasyRTC嵌入式视频通话SDK如何简化实时音视频通信的集成与应用

嵌入式设备和视频综合管理平台均支持B/S架构。在B/S架构下&#xff0c;传统的视频观看方式依赖于微软的OCX控件&#xff0c;然而OCX控件的使用正面临越来越多的挑战&#xff1a; 首先&#xff0c;用户需要安装浏览器插件、调整浏览器安全级别&#xff0c;并允许ActiveX控件弹出…...

Zookeeper(58)如何在Zookeeper中实现分布式锁?

在 Zookeeper 中实现分布式锁是一种常见的用例。Zookeeper 提供了强一致性、高可用性的分布式协调服务&#xff0c;使得它非常适合用来实现分布式锁。以下是详细的步骤和代码示例&#xff0c;展示如何在 Zookeeper 中实现分布式锁。 1. Zookeeper 分布式锁的基本原理 Zookeep…...

Mac端homebrew安装配置

拷打了一下午o3-mini-high&#xff0c;不如这位博主的超强帖子&#xff0c;10分钟结束战斗 跟随该文章即可&#xff0c;2025/2/19亲测可行 mac 安装HomeBrew(100%成功)_mac安装homebrew-CSDN博客文章浏览阅读10w次&#xff0c;点赞258次&#xff0c;收藏837次。一直觉得自己写…...

Spring 接入 DeepSeek

引入依赖 <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId> </dependency>2.yml配置 spring:ai:openai:api-key: sk-xxxxx // 填写自己申请的keybase-url: http…...

vscode将文件中行尾默认CRLF改为LF

安装prettier npm install --save-dev --save-exact prettier执行命令 npx prettier --write --end-of-line lf .即可将项目中的所有文件行尾序列格式改为lf *在你使用git拉取代码的时候&#xff0c;git会自动将代码当中与你当前系统不同的换行方式转化成你当前系统的换行方…...

python-leetcode 33.排序链表

题目&#xff1a; 给定链表的头结点head,请将其按升序排列&#xff0c;并返回排序后的链表 方法一&#xff1a;自顶向下归并排序 链表自顶向下归并排序的过程&#xff1a; 1.找到链表的中点&#xff0c;以中点为分界&#xff0c;将链表拆分成两个子链表。寻找链表的中点可以…...

【数据结构初阶第十二节】设计循环队列

云边有个稻草人-CSDN博客 必须有为成功付出代价的决心&#xff0c;然后想办法付出这个代价。 还有最后一道关于队列的习题&#xff0c;这题有点难&#xff0c;准备好迎接挑战吧&#xff01; 目录 1.【题目】 2.实现循环队列推荐用数组&#xff0c;Why? 3.Q1&#xff1a;如…...

基于微信小程序的民宿短租系统设计与实现(ssm论文源码调试讲解)

第4章 系统设计 4.1系统设计的目标 系统设计的目标是满足用户的需求和满足系统实现所需要的所有要求。本系统收集了信息浏览、信息删除、信息添加、信息修改、信息查询为一体[17]。改变了用户民宿短租的方式&#xff0c;提高管理员管理效率以及用户预订的效率。为用户、房主提…...

使用 Jetty 构建 HTTPS 服务入门指南

在互联网安全越来越重要的今天,使用 HTTPS 为 Web 服务提供安全传输成为标准配置。Jetty 是一个高性能、易用且功能丰富的开源 Java HTTP 服务器和 Servlet 容器,能够轻松实现 HTTPS 支持。本文将结合代码实例,引导您快速搭建一个基于 Jetty 的 HTTPS 服务。 一、Jetty 简介…...

数据结构《图》

数据结构《图论》 图的性质 一、无向图&#xff08;Undirected Graph&#xff09; 定义 由一组顶点&#xff08;Vertex&#xff09;和一组无向边&#xff08;Edge&#xff09;构成。 每条无向边用一条无方向的线段连接两个顶点&#xff0c;记为 ( (u, v) )&#xff0c;其中…...

用Chrome Recorder轻松完成自动化测试脚本录制

前言 入门自动化测试,录制回放通常是小白测试首先用到的功能。而录制回放工具也一直是各大Web自动化测试必然会着重提供的一块功能。 早期WinRunner、QTP这样的工具,自动化测试可以说是围绕录制回放开展的。近年像Selenium也提供有录制工具 Selenium IDE,Playwright也包含…...

⭐️苹果电脑安装windows10双系统【详细图文步骤保姆级教程】【本教材适用于MAC台式机、笔记本MacBook air和pro】

苹果电脑安装windows10双系统【详细图文步骤保姆级教程】【本教材适用于MAC台式机、笔记本MacBook air和pro】 苹果电脑安装windows10双系统一、准备工作准备项1&#xff1a;U盘作为系统安装盘准备项2&#xff1a;您需要安装的系统镜像 二、启动转换助理步骤1&#xff1a;找到启…...

win10系统上的虚拟机安装麒麟V10系统提示找不到操作系统

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 win10系统上的虚拟机安装麒麟V10系统提示找不到操作系统&#xff0c;报错&#xff1a;Operating System not found 二、原因分析 国产系统&#xff0c;需要注意的点&#xff1a; 需要看你的系统类…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...