力扣每日打卡17 49. 字母异位词分组 (中等)

news2025/4/23 13:08:46

力扣 49. 字母异位词分组 中等

  • 前言
  • 一、题目内容
  • 二、解题方法
    • 1. 哈希函数
    • 2.官方题解
      • 2.1 前言
      • 2.2 方法一:排序
      • 2.2 方法二:计数


前言

这是刷算法题的第十七天,用到的语言是JS
题目:力扣 49. 字母异位词分组 (中等)


一、题目内容

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

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

示例 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. 哈希函数

将相同字母的扔到一块,然后再按照字典序进行排序输出

代码如下(示例):

/**
 * @param {string[]} strs
 * @return {string[][]}
 */
var groupAnagrams = function(strs) {
  // 题目的意思?:将相同字母的扔到一块,然后再按照字典序进行排序输出?
  // 我的疑问:怎么做到第一步

  const map = new Map()
  const arr = [] // 存放返回的数组
  
  for(let i = 0; i < strs.length; i++) {
    const sort = strs[i].split('').sort().join('') // 排序,将相同字母的字符串排序后,得到相同的字符串
    map.set(sort, [...(map.get(sort) || []), strs[i]]) 
    // 解释一下这行代码:如果map中存在sort,则取出sort对应的数组,将strs[i]放入数组中,如果不存在sort,则新建一个数组,将strs[i]放入数组中
    // 再人话点:...(map.get(sort)将 值(值数组['eat', 'tea'])展开成 'eat', 'tea',然后再添加上 strs[i](是ate),然后就变成了 'eat', 'tea', 'ate'

    // 将上面这行代码拆解出来
    // if(map.has(sort)) {
    //   map.set(sort, [...map.get(sort), strs[i]])
    // } else {
    //   map.set(sort, [strs[i]])
    // }

  }

  for(const [key, value] of map) {
    arr.push(value)
  }
  return arr
}

console.log(groupAnagrams(["eat", "tea", "tan", "ate", "nat", "bat"]))

2.官方题解

2.1 前言

两个字符串互为字母异位词,当且仅当两个字符串包含的字母相同。同一组字母异位词中的字符串具备相同点,可以使用相同点作为一组字母异位词的标志,使用哈希表存储每一组字母异位词,哈希表的键为一组字母异位词的标志,哈希表的值为一组字母异位词列表。

遍历每个字符串,对于每个字符串,得到该字符串所在的一组字母异位词的标志,将当前字符串加入该组字母异位词的列表中。遍历全部字符串之后,哈希表中的每个键值对即为一组字母异位词。

以下的两种方法分别使用排序和计数作为哈希表的键。

2.2 方法一:排序

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

代码如下(示例):

var groupAnagrams = function(strs) {
    const map = new Map();
    for (let str of strs) {
        let array = Array.from(str);
        array.sort();
        let key = array.toString();
        let list = map.get(key) ? map.get(key) : new Array();
        list.push(str);
        map.set(key, list);
    }
    return Array.from(map.values());
};

作者:力扣官方题解
链接:https://leetcode.cn/problems/group-anagrams/solutions/520469/zi-mu-yi-wei-ci-fen-zu-by-leetcode-solut-gyoc/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
复杂度分析:
时间复杂度: O ( n k l o g k ) O(nklogk) O(nklogk),其中 n n n s t r s strs strs 中的字符串的数量, k k k s t r s strs strs 中的字符串的的最大长度。需要遍历 n n n 个字符串,对于每个字符串,需要 O ( k l o g k ) O(klogk) O(klogk) 的时间进行排序以及 O ( 1 ) O(1) O(1) 的时间更新哈希表,因此总时间复杂度是 O ( n k l o g k ) O(nklogk) O(nklogk)
空间复杂度: O ( n k ) O(nk) O(nk),其中 n n n s t r s strs strs 中的字符串的数量, k k k s t r s strs strs 中的字符串的的最大长度。需要用哈希表存储全部字符串。

链接:力扣本题官方题解
来源:力扣(LeetCode)

2.2 方法二:计数

由于互为字母异位词的两个字符串包含的字母相同,因此两个字符串中的相同字母出现的次数一定是相同的,故可以将每个字母出现的次数使用字符串表示,作为哈希表的键。

由于字符串只包含小写字母,因此对于每个字符串,可以使用长度为 26 的数组记录每个字母出现的次数。需要注意的是,在使用数组作为哈希表的键时,不同语言的支持程度不同,因此不同语言的实现方式也不同。

代码如下(示例):

var groupAnagrams = function(strs) {
    const map = new Object();
    for (let s of strs) {
        const count = new Array(26).fill(0);
        for (let c of s) {
            count[c.charCodeAt() - 'a'.charCodeAt()]++;
        }
        map[count] ? map[count].push(s) : map[count] = [s];
    }
    return Object.values(map);
};

作者:力扣官方题解
链接:https://leetcode.cn/problems/group-anagrams/solutions/520469/zi-mu-yi-wei-ci-fen-zu-by-leetcode-solut-gyoc/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在这里插入图片描述

链接:力扣本题官方题解
来源:力扣(LeetCode)

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

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

相关文章

Word处理控件Spire.Doc系列教程:C# 为 Word 文档设置背景颜色或背景图片

在 Word 文档中&#xff0c;白色是默认的背景设置。一般情况下&#xff0c;简洁的白色背景足以满足绝大多数场景的使用需求。但是&#xff0c;如果您需要创建简历、宣传册或其他创意文档&#xff0c;设置独特的背景颜色或图片能够极大地增强文档的视觉冲击力。本文将演示如何使…

掌握 Altium Designer:轻松定制“交换器件”工具栏

在PCB设计过程中&#xff0c;快速交换器件&#xff08;如电阻、电容、IC等&#xff09;是提高效率的关键。Altium Designer提供了灵活的工具栏定制功能&#xff0c;让用户可以创建专属的"交换器件"工具栏&#xff0c;将常用操作集中管理&#xff0c;减少菜单切换时间…

【C++ Qt】信号和槽(内配思维导图 图文并茂 通俗易懂)

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 本章是Qt中的第三章&#xff0c;也是我们理解Qt中必备的点 信号槽&#xff0c;它本质由信号和槽两个来实现&#xff0c;其中将细致的讲述如何自定义信号…

从零开始构建微博爬虫:实现自动获取并保存微博内容

从零开始构建微博爬虫&#xff1a;实现自动获取并保存微博内容 前言 在信息爆炸的时代&#xff0c;社交媒体平台已经成为信息传播的重要渠道&#xff0c;其中微博作为中国最大的社交媒体平台之一&#xff0c;包含了大量有价值的信息和数据。对于研究人员、数据分析师或者只是…

三餐四季、灯火阑珊

2025年4月22日&#xff0c;15~28℃&#xff0c;挺好的 待办&#xff1a; 教学技能大赛教案&#xff08;2025年4月24日&#xff0c;校赛&#xff0c;小组合作&#xff0c;其他成员给力&#xff0c;暂不影响校赛进度&#xff0c;搁置&#xff09; 教学技能大赛PPT&#xff08;202…

基于javaweb的SSM+Maven教材管理系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

NineData 与飞书深度集成,企业级数据管理审批流程全面自动化

NineData 正式推出与飞书审批系统的深度集成功能&#xff0c;企业用户在 NineData 平台发起的审批工单&#xff0c;将自动推送至审批人的飞书中&#xff0c;审批人可以直接在飞书进行审批并通过/拒绝。该功能实现跨系统协作&#xff0c;带来巨大的审批效率提升&#xff0c;为各…

mockMvc构建web单元测试学习笔记

web应用本来需要依靠tomcat这个环境运行 现在用mockMvc是为了模拟这个web环境&#xff0c;简化测试 什么是mock(模拟) 模拟对象---mock object是以可控方式模拟真实对象行为的假对象&#xff0c;通过模拟输入数据&#xff0c;验证程序达到预期结果 为什么使用mock对象 因为…

Windows7升级Windows10,无法在此驱动器上安装Windows

一、现象描述 台式机工作站&#xff0c;从Windows7升级Windows10&#xff0c;采用MediaCreationTool_22H2制作U盘启动盘&#xff0c;安装系统遇到问题如下&#xff1a; 二、原因分析 是由于硬盘格式不是GPT硬盘&#xff0c;而Windows系统只能安装到GPT硬盘上&#xff0c;所以…

Idea创建项目的搭建

1、普通java项目 如果没有project SDK去new&#xff0c;默认在C:\Program Files\Java\jdk1.8.0_261 输入项目名称和项目路径 点击完成&#xff0c;即创建好一个普通的Java项目。 2、普通JavaWEB项目 目录中没有WEB-INF文件可以直接从tomcat中粘贴过来 D:\apache-tomcat-8.5.…

GpuGeek:以弹性算力与全栈服务赋能产业智能升级

在人工智能技术快速融入各领域的趋势下&#xff0c;企业对高效、低成本的AI基础设施需求日益迫切。GpuGeek作为一站式AI基础设施平台&#xff0c;凭借其弹性算力调度、全流程开发支持、全球化资源覆盖以及国产化技术适配四大核心优势&#xff0c;为产业智能化升级提供了坚实的技…

网络原理 - 4(TCP - 1)

目录 TCP 协议 TCP 协议段格式 可靠传输 几个 TCP 协议中的机制 1. 确认应答 2. 超时重传 完&#xff01; TCP 协议 TCP 全称为 “传输控制协议”&#xff08;Transmission Control Protocol&#xff09;&#xff0c;要对数据的传输进行一个详细的控制。 TCP 协议段格…

强化学习框架:OpenRLHF源码解读,模型处理

本文主要介绍 强化学习框架&#xff1a;OpenRLHF源码解读&#xff0c;模型处理 models框架设计 了解一下 OpenRLHF的模型框架设计范式&#xff1a; From:https://arxiv.org/pdf/2405.11143 可以知道一个大概的流程&#xff1a;输入Pormpt通过Actor model输出回复 Response&am…

STL常用算法——C++

1.概述 2.常用遍历算法 1.简介 2.for_each 方式一&#xff1a;传入普通函数&#xff08;printf1&#xff09; #include<stdio.h> using namespace std; #include<string> #include<vector> #include<functional> #include<algorithm> #include…

UofTCTF-2025-web-复现

感兴趣朋友可以去我博客里看&#xff0c;画风更好看 UofTCTF-2025-web-复现 文章目录 scavenger-huntprismatic-blogscode-dbprepared-1prepared-2timeless scavenger-hunt 国外的一些ctf简单题就喜欢把flag藏在注释里&#xff0c;开源代码找到第一部分的flag 抓个包返回数据…

[密码学基础]GB与GM国密标准深度解析:定位、差异与协同发展

[密码学基础]GB与GM国密标准深度解析&#xff1a;定位、差异与协同发展 导语 在国产密码技术自主可控的浪潮下&#xff0c;GB&#xff08;国家标准&#xff09;与GM&#xff08;密码行业标准&#xff09;共同构建了我国商用密码的技术规范体系。二者在制定主体、法律效力、技术…

15.第二阶段x64游戏实战-分析怪物血量(遍历周围)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;14.第二阶段x64游戏实战-分析人物的名字 如果想实现自动打怪&#xff0c;那肯定…

HarmonyOS 基础语法概述 UI范式

ArkUI框架 - UI范式 ArkTS的基本组成 装饰器&#xff1a; 用于装饰类、结构、方法以及变量&#xff0c;并赋予其特殊的含义。如上述示例中Entry、Component和State都是装饰器&#xff0c;Component表示自定义组件&#xff0c;Entry表示该自定义组件为入口组件&#xff0c;Stat…

专题讨论2:树与查找

在讨论前先回顾一下定义&#xff1a; BST树的定义 二叉搜索树是一种特殊的二叉树&#xff0c;对于树中的任意一个节点&#xff1a; 若它存在左子树&#xff0c;那么左子树中所有节点的值都小于该节点的值。 若它存在右子树&#xff0c;那么右子树中所有节点的值都大于该节点…

django之数据的翻页和搜索功能

数据的翻页和搜素功能 目录 1.实现搜素功能 2.实现翻页功能 一、实现搜素功能 我们到bootstrap官网, 点击组件, 然后找到输入框组, 并点击作为额外元素的按钮。 我们需要使用上面红色框里面的组件, 就是搜素组件, 代码部分就是下面红色框框出来的部分。 把这里的代码复制…