力扣每日打卡17 49. 字母異位詞分組 (中等)

力扣 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.pswp.cn/diannao/80001.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/80001.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/80001.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#抽象類和虛方法的作用是什么?

抽象類 (abstract class)&#xff1a; 不能直接實例化&#xff0c;只能被繼承。 用來定義一套基礎框架和規范&#xff0c;強制子類必須實現某些方法&#xff08;抽象方法&#xff09;。 可用來封裝一些共通的邏輯&#xff0c;減少代碼重復。 虛方法 (virtual)&#xff1a; …

PowerBi中ALLEXCEPT怎么使用?

在 Power BI 的 DAX 中&#xff0c;ALLEXCEPT() 是一個非常重要的函數&#xff0c;用來實現**“在保留部分篩選條件的前提下&#xff0c;移除其他所有篩選器”**&#xff0c;它常用于 同比、占比、累計匯總 等分析中。 ? 一、ALLEXCEPT 是什么意思&#xff1f; 函數全稱&…

IQ信號和實信號的關系與轉換的matlab實現

IQ信號 IQ信號通常是指兩路正交的信號(I路和Q路),在實際信號采樣中,通常會進行IQ采樣,將實信號轉換為復基帶信號進行存儲。 IQ信號轉實信號 IQ信號轉為實信號,其實就是將IQ兩路正交信號通過上變頻合并為一個實數的帶通信號,這通常在通信系統中用于將基帶信號調制到載…

【鋰電池剩余壽命預測】LSTM長短期記憶神經網絡鋰電池剩余壽命預測(Matlab源碼)

目錄 效果一覽程序獲取程序內容代碼分享研究內容基于LSTM長短期記憶神經網絡的鋰電池剩余壽命預測摘要關鍵詞1. 引言1.1 研究背景1.2 研究現狀與問題1.3 研究目的與意義2. 文獻綜述2.1 鋰電池剩余壽命預測方法概述2.2 傳統預測方法的優勢與不足2.3 LSTM在鋰電池壽命預測中的應用…

具身智能的理論基礎

引言 在人工智能與認知科學快速發展的背景下&#xff0c;“具身智能”&#xff08;Embodied Intelligence&#xff09;這一概念日益受到重視。具身智能是指智能體的認知能力不僅源于其大腦&#xff08;或中央處理單元&#xff09;&#xff0c;更根植于其身體的結構、感官與其所…

【數據結構】勵志大廠版·初級(二刷復習)雙鏈表

前引&#xff1a;今天學習的雙鏈表屬于鏈表結構中最復雜的一種&#xff08;帶頭雙向循環鏈表&#xff09;&#xff0c;按照安排&#xff0c;我們會先進行復習&#xff0c;如何實現雙鏈表&#xff0c;如基本的頭插、頭刪、尾刪、尾插&#xff0c;掌握每個細節&#xff0c;隨后進…

CSS `display` 屬性詳解(完整版)

CSS display 屬性詳解&#xff08;完整版&#xff09; 1. 屬性值及特性詳解 display 屬性控制元素的布局類型和生成的框類型&#xff0c;以下是 所有有效值 及其特性&#xff1a; 1.1 基礎類型 值描述布局行為是否生成塊級框典型用途block元素獨占一行&#xff0c;寬度自動撐…

【數據結構 · 初階】- 堆的實現

目錄 一.初始化 二.插入 三.刪除&#xff08;堆頂、根&#xff09; 四.整體代碼 Heap.h Test.c Heap.c 我們使用順序結構實現完全二叉樹&#xff0c;也就是堆的實現 以前學的數據結構只是單純的存儲數據。堆除了存儲數據&#xff0c;還有其他的價值——排序。是一個功能…

qt.tlsbackend.ossl: Failed to load libssl/libcrypto.

我的環境是windows&#xff0c;QT6.3.2&#xff08;msvc2019_64/mingw_64&#xff09; 出錯原因 QT沒有正確加載OpenSSL。 解決過程 1、確保安裝的有openssl。 文章結尾有個注意&#xff0c;是其他方式安裝過openssl&#xff0c;環境變量有&#xff0c;但是QT找不到的問題。…

【Linux】用戶權限

shell命令 1. Linux本質上是一個操作系統&#xff0c;但是一般的用戶不能直接使用它&#xff0c;而是需要通過外殼程序shell&#xff0c;來與Linux內核進行溝通。 2. shell的簡單定義&#xff1a;命令行解釋器。主要包含以下作用&#xff1a; 將使用者的命令翻譯給核心處理。將…

賽靈思 XC7K325T-2FFG900I FPGA Xilinx Kintex?7

XC7K325T-2FFG900I 是 Xilinx Kintex?7 系列中一款工業級 (I) 高性能 FPGA&#xff0c;基于 28 nm HKMG HPL 工藝制程&#xff0c;核心電壓標稱 1.0 V&#xff0c;I/O 電壓可在 0.97 V–1.03 V 之間靈活配置&#xff0c;并可在 –40 C 至 100 C 溫度范圍內穩定運行。該器件提供…

【題解-Acwing】847. 圖中點的層次

題目:847. 圖中點的層次 題目描述 給定一個 n 個點 m 條邊的有向圖,圖中可能存在重邊和自環。 所有邊的長度都是 1,點的編號為 1~n。 請你求出 1 號點到 n 號點的最短距離,如果從 1 號點無法走到 n 號點,輸出 ?1 。 輸入 第一行包含兩個整數 n 和 m。 接下來 m 行…

css圖片設為灰色

使用filter方式將圖片設置為灰色 普通圖片使用&#xff1a;filter: saturate(0); 純白圖片使用&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"width…

【Luogu】動態規劃一

P5414 [YNOI2019] 排序 - 洛谷 思路&#xff1a; 可以想到對于任意一個需要換位置的數字&#xff0c;我們不可能換兩次及以上&#xff0c;那么這題就可以轉化為求一個最大和的最長不遞減子序列&#xff0c;最后的答案就是眾和減去這個最大和 代碼&#xff1a; #include <…

什么是管理思維?

管理思維是指在管理活動中形成的系統性、戰略性和創造性的思考方式&#xff0c;幫助個人或團隊更高效地達成目標。它不僅適用于企業管理&#xff0c;也適用于個人成長、項目執行和復雜問題解決。以下是關于管理思維的核心內容&#xff1a; 一、管理思維的核心特征 1. 系統性思…

利用TCP+多進程技術實現私聊信息

服務器&#xff1a; import socket from multiprocessing import Process from threading import Threaduser_dic {}def send_recv(client_conn, client_addr):while 1:# 接收客戶端發送的消息res client_conn.recv(1024).decode("utf-8")print("客戶端發送…

Hbuilder 上的水印相機實現方案 (vue3 + vite + hbuilder)

效果 思路 通過 live-pusher 這個視頻推流的組件來獲取攝像頭拿到視頻的一幀圖片之后&#xff0c;跳轉到正常的 vue 頁面&#xff0c;通過 canvas 來處理圖片水印 源碼 live-pusher 這個組件必須是 nvue 的 至于什么是 nvue&#xff0c;看這個官方文檔吧 https://uniapp.dcl…

Spark,IDEA編寫Maven項目

IDEA中編寫Maven項目 1.打開IDEA新建項目2.選擇java語言&#xff0c;構建系統選擇Maven 3.IDEA中配置Maven 注&#xff1a;這些文件都是我們老師幫我們在網上找了改動后給我們的&#xff0c;大家可自行在網上查找 編寫代碼測試HDFS連接 1.在之前創建的pom.xml文件中添加下…

初識Redis · C++客戶端set和zset

目錄 前言&#xff1a; set sadd sismember smembers spop scard sinter sinterstore zset zadd zrange zcard zrem zrank zscore 前言&#xff1a; 前文我們已經介紹了string list hash在Redis-plus-plus的使用&#xff0c;本文我們開始介紹set和zset在redis-plus-pl…

sed命令筆記250419

sed命令筆記250419 sed&#xff08;Stream Editor&#xff09;是 Linux/Unix 系統中強大的流編輯器&#xff0c;主要用于對文本進行過濾和轉換&#xff08;按行處理&#xff09;。它支持正則表達式&#xff0c;適合處理文本替換、刪除、插入等操作。以下是 sed 的詳細解析&…