LeetCode算法日記 - Day 8: 串聯所有單詞的子串、最小覆蓋子串

目錄

1.串聯所有單詞的子串

1.2 解法

1.3?代碼實現

2.? 最小覆蓋子串

2.1 題目解析

2.2 解法

2.3 代碼實現


1.串聯所有單詞的子串

30. 串聯所有單詞的子串 - 力扣(LeetCode)

給定一個字符串?s?和一個字符串數組?words?words?中所有字符串?長度相同

?s?中的?串聯子串?是指一個包含??words?中所有字符串以任意順序排列連接起來的子串。

  • 例如,如果?words = ["ab","cd","ef"], 那么?"abcdef",?"abefcd""cdabef",?"cdefab""efabcd", 和?"efcdab"?都是串聯子串。?"acdbef"?不是串聯子串,因為他不是任何?words?排列的連接。

返回所有串聯子串在?s?中的開始索引。你可以以?任意順序?返回答案。

示例 1:

輸入:s = "barfoothefoobarman", words = ["foo","bar"]
輸出:[0,9]
解釋:因為 words.length == 2 同時 words[i].length == 3,連接的子字符串的長度必須為 6。
子串 "barfoo" 開始位置是 0。它是 words 中以 ["bar","foo"] 順序排列的連接。
子串 "foobar" 開始位置是 9。它是 words 中以 ["foo","bar"] 順序排列的連接。
輸出順序無關緊要。返回 [9,0] 也是可以的。

示例 2:

輸入:s = "wordgoodgoodgoodbestword", words = ["word","good","best","word"]
輸出:[]
解釋:因為 words.length == 4 并且 words[i].length == 4,所以串聯子串的長度必須為 16。
s 中沒有子串長度為 16 并且等于 words 的任何順序排列的連接。
所以我們返回一個空數組。

示例 3:

輸入:s = "barfoofoobarthefoobarman", words = ["bar","foo","the"]
輸出:[6,9,12]
解釋:因為 words.length == 3 并且 words[i].length == 3,所以串聯子串的長度必須為 9。
子串 "foobarthe" 開始位置是 6。它是 words 中以 ["foo","bar","the"] 順序排列的連接。
子串 "barthefoo" 開始位置是 9。它是 words 中以 ["bar","the","foo"] 順序排列的連接。
子串 "thefoobar" 開始位置是 12。它是 words 中以 ["the","foo","bar"] 順序排列的連接。

1.1 題目解析

這道題可以類比于 438.找到字符串中所有字母的異位詞,只不過這道題里,需要把字母換成子串。這個還有區別于 438 的地方是,438 是通過 for 循環里嵌套 while 循環來決定?起點 (也就是修改左指針位置),而這類則是通過 for 循環來決定起點。

1.2 解法

解法類似于 找到字符串中所有字母的異位詞

i)定義兩個 hash 表,一個用來存 words,一個用來存字符串 s

ii)進入循環,定義有效子串數量 count。

iii)進窗口:進窗口時后先進行?hash2.get(in)<=hash1.getOrDefault(in,0) 來判斷是否為有效字符串。如果有效則使 count++,反之則 count 不變。

iiii)判斷:ight-left+1>len*m,len 為單個詞長度,m 為詞的數量。通過限制窗口大小,來達成滑動窗口內都是該 words 的子串的數量。

iiiii)出窗口:出窗口前?hash2.get(out)<=hash1.getOrDefault(out,0) 來判斷出窗口是否為有效子串。如果有效則使 count++,反之則 count 不變。

iiiiii)返回結果:當 count == m 時,則代表該窗口內都是 words 的子串。

1.3?代碼實現

class Solution {public List<Integer> findSubstring(String s, String[] pp) {List<Integer> ret = new ArrayList<Integer>();Map<String,Integer> hash1 = new HashMap<String,Integer>();for(String p : pp){hash1.put(p, hash1.getOrDefault(p,0)+1);}int len = pp[0].length(), m = pp.length;for(int i = 0;i<len;i++){Map<String,Integer> hash2 = new HashMap<String,Integer>();//left 和 right 是在 s 上操作的for(int left = i,right = i,count = 0 ;right+len<=s.length();right+=len){String in = s.substring(right,right+len);hash2.put(in,hash2.getOrDefault(in,0)+1);if(hash2.get(in)<=hash1.getOrDefault(in,0)){count++;}if(right-left+1>len*m){String out = s.substring(left,left+len);if(hash2.get(out)<=hash1.getOrDefault(out,0)){count--;}hash2.put(out,hash2.get(out)-1);left+=len;}if(count==m){ret.add(left);}}}return ret;}
}

2.? 最小覆蓋子串

?76. 最小覆蓋子串 - 力扣(LeetCode)

給你一個字符串?s?、一個字符串?t?。返回?s?中涵蓋?t?所有字符的最小子串。如果?s?中不存在涵蓋?t?所有字符的子串,則返回空字符串?""?。

注意:

  • 對于?t?中重復字符,我們尋找的子字符串中該字符數量必須不少于?t?中該字符數量。
  • 如果?s?中存在這樣的子串,我們保證它是唯一的答案。

示例 1:

輸入:s = "ADOBECODEBANC", t = "ABC"
輸出:"BANC"
解釋:最小覆蓋子串 "BANC" 包含來自字符串 t 的 'A'、'B' 和 'C'。

示例 2:

輸入:s = "a", t = "a"
輸出:"a"
解釋:整個字符串 s 是最小覆蓋子串。

示例 3:

輸入: s = "a", t = "aa"
輸出: ""
解釋: t 中兩個字符 'a' 均應包含在 s 的子串中,
因此沒有符合條件的子字符串,返回空字符串。

2.1 題目解析

這道題與之前所講的滑動窗口不同,以往更新結果都是在判斷后更新,而這次是在判斷內更新結果。這道題因為涉及到每個單詞都有可能重復,所以我們再用數量來判斷就不合理了。因此我們需要判斷字母的種類,窗口內的單個字母數量要等于字符串中單個字母的數量,才能進行種類加1。

這里的更新結果與之前有所不同,需要定一個 min_len 和 begin 來輔助返回結果,定義 kinds 來記錄子串字符種類,count 來記錄是否達到最小子串。

2.2 解法

i)先把字符串轉成字符數組

ii)對 hash 表進行初始化,記錄最小子串需要的字母種類和次數

iii)定義 min_len, begin, count, kinds 用來記錄結果返回,定義雙指針并進入 for 循環

iiii)進窗口:進窗口后判斷?++hash2[s[right]] == hash1[s[right]],如果成立則使 count++,這代表了完成子串其一的字符種類和數量

iiiii)判斷:判斷 count == kinds,如果成立則代表打成子串的要求,更新 min_len, begin 用來返回結果。

iiiiii)出窗口:出窗口前判斷?hash2[s[left]]--==hash1[s[left]],如果成立 count--,反之則不變

iiiiiii)返回結果

2.3 代碼實現

class Solution {public String minWindow(String ss, String tt) {char[] s = ss.toCharArray();char[] t = tt.toCharArray();int[] hash1 = new int[128];int kinds = 0;for(char ch : t){if(hash1[ch]++ == 0){kinds++;}}int[] hash2 = new int[128];int min_len = Integer.MAX_VALUE,begin = -1;for(int left =0,right = 0,count =0;right<s.length;right++){if(++hash2[s[right]] == hash1[s[right]]){count++;}while(count == kinds){//更新結果if(right-left+1 < min_len){min_len = right-left+1;begin = left;}if(hash2[s[left]]--==hash1[s[left]]){count--;}left++;}}if(begin == -1){return new String();}return ss.substring(begin,begin+min_len);}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/918377.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918377.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918377.shtml

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

相關文章

linux實戰:基于Ubuntu的專業相機

核心組件就是QTimerOpenCV的組合方案攝像頭啟停控制用QPushButton實現&#xff0c;幀顯示必須用QLabel而不能用普通控件&#xff0c;視頻流刷新用QTimer比多線程更簡單想快速實現攝像頭控制功能&#xff0c;核心組件就是QTimerOpenCV的組合方案。攝像頭啟停控制用QPushButton實…

《深度剖析前端框架中錯誤邊界:異常處理的基石與進階》

錯誤邊界作為一種特殊的組件機制&#xff0c;正悄然重塑著應用應對異常的底層邏輯。它并非簡單的代碼片段組合&#xff0c;而是一套貫穿組件生命周期的防護體系&#xff0c;其核心價值在于將局部錯誤的影響牢牢鎖定在可控范圍內&#xff0c;避免整個應用陷入不可挽回的崩潰狀態…

6GB顯存玩轉SD微調!LoRA-scripts本地部署教程,一鍵煉出專屬AI畫師

一、介紹LoRA-scripts&#xff08;又名 SD-Trainer&#xff09;&#xff0c;是一個專為訓練低秩自適應&#xff08;LoRA&#xff09;模型設計的開源工具集主要應用于Stable Diffusion等AI繪圖模型的微調&#xff0c;幫助用戶高效創建定制化風格、角色或概念的輕量級模型。目前已…

探索AI的數學奇跡:Gemini 2.5 Pro如何摘得IMO金牌

?? 引言:從人類天才到AI奇才的跨越 想象一下,一個AI模型坐在國際數學奧林匹克(IMO)的考場里,手里拿著筆(好吧,其實是處理token),面對那些讓高中生們頭疼不已的難題。它不是靠死記硬背,而是通過深思熟慮的推理,一步步攻克難關。這聽起來像科幻小說,但2025年,這已…

MCP學習與實踐

目錄 1.MCP簡介 1.1 MCP是什么 1.2 MCP與Agent關系&#xff1a; 1.3 MCP的架構 2. MCP原理 2.1 MCP 工作過程 2.2 MCP 通訊方式 2. MCP使用 2.1 cursor中增加MCP-SSE(高德地圖MCP) 2.2 cursor中增加MCP-STDIO&#xff08;12306-MCP&#xff09; 本文詳細講解了什么是…

MySQL(187)如何使用pt-query-digest進行查詢分析?

使用 pt-query-digest 工具可以幫助分析 MySQL 查詢的性能&#xff0c;找出慢查詢、頻繁查詢以及消耗資源較多的查詢&#xff0c;從而為優化提供依據。以下是詳細深入的使用 pt-query-digest 進行查詢分析的步驟和相關示例。 一、安裝 pt-query-digest pt-query-digest 是 Perc…

分享一個基于Python和Hadoop的的電信客戶特征可視化分析平臺 基于Spark平臺的電信客服數據存儲與處理系統源碼

&#x1f495;&#x1f495;作者&#xff1a;計算機源碼社 &#x1f495;&#x1f495;個人簡介&#xff1a;本人八年開發經驗&#xff0c;擅長Java、Python、PHP、.NET、Node.js、Spark、hadoop、Android、微信小程序、爬蟲、大數據、機器學習等&#xff0c;大家有這一塊的問題…

初識STL

一 、STL的誕生在C發展早期&#xff0c;程序員在不同的項目中需要反復編寫相似的數據結構和算法。重復開發帶來以下問題&#xff1a;代碼冗余&#xff1a;每個項目都要重新實現基本數據結構和算法維護困難&#xff1a;不同人編寫的代碼風格不一致&#xff0c;難以維護效率低下&…

DDoS 防護的未來趨勢:AI 如何重塑安全行業?

隨著網絡攻擊規模和復雜性的不斷升級&#xff0c;分布式拒絕服務&#xff08;DDoS&#xff09;攻擊已成為企業數字化轉型中的一大威脅。傳統防御手段在應對智能化、動態化的攻擊時逐漸顯露出局限性。而人工智能&#xff08;AI&#xff09;技術的崛起&#xff0c;正為 DDoS 防護…

【每天一個知識點】深度領域對抗神經網絡

Deep Domain Adversarial Neural Network&#xff08;深度領域對抗神經網絡&#xff0c;DDANN&#xff09; 是一類結合 深度學習 與 領域自適應&#xff08;domain adaptation&#xff09; 思想的神經網絡結構&#xff0c;主要用于不同數據域之間的知識遷移&#xff0c;尤其是在…

【C語言】深入理解預處理

文章目錄一、預定義符號二、#define定義常量&#xff1a;便捷的符號替換常見用法示例&#xff1a;注意事項&#xff1a;三、#define定義宏&#xff1a;帶參數的文本替換關鍵注意點&#xff1a;四、帶有副作用的宏參數五、宏替換的規則&#xff1a;預處理的執行步驟重要注意&…

展銳平臺(Android15)WLAN熱點名稱修改不生效問題分析

前言 在展銳Android V項目開發中&#xff0c;需要修改softAp/P2P熱點名稱時&#xff0c;發現集成GMS后直接修改framework層代碼無效。具體表現為&#xff1a; 修改packages/modules/Wifi/WifiApConfigStore中的getDefaultApConfiguration方法編譯燒錄后修改不生效 問題根源在…

wsl ubuntu訪問(掛載)vmware vmdk磁盤教程

之前使用VMware Workstation 虛擬機跑了個ubuntu&#xff0c;現在改用wsl了&#xff0c; 想把vmware的磁盤掛載到wsl ubuntu。一、磁盤合并我原先的vmware跑的ubuntu存在多個vmdk文件&#xff08;磁盤文件&#xff09;&#xff0c;需要先將磁盤合并成一個才方便掛載。首先你電腦…

UGUI源碼剖析(3):布局的“原子”——RectTransform的核心數據模型與幾何學

UGUI源碼剖析&#xff08;第三章&#xff09;&#xff1a;布局的“原子”——RectTransform的核心數據模型與幾何學 在前幾章中&#xff0c;我們了解了UGUI的組件規范和更新調度機制。現在&#xff0c;我們將深入到這個系統的“幾何學”核心&#xff0c;去剖析那個我們每天都在…

c++注意點(15)----設計模式(橋接模式與適配器模式)

一、結構型設計模式兩者有點相似&#xff0c;都是為了做到解耦的功能。適配器模式是一種結構型設計模式&#xff0c; 它能使接口不兼容的對象能夠相互合作。橋接模式是一種結構型設計模式&#xff0c; 可將一個大類或一系列緊密相關的類拆分為抽象和實現兩個獨立的層次結構&…

DuoPlus支持導入文件批量配置云手機參數,還優化了批量操作和搜索功能!

作為我常用的一款還不錯的跨境工具&#xff0c;DuoPlus云手機幫我高效完成了很多跨境工作&#xff0c;它的功能也在逐步完善和優化&#xff0c;今天來聊聊它最近新更新的一些功能。功能更新一覽新增導入文件配置參數&#xff1a;批量初始化代理、批量修改參數支持導入文件一鍵配…

PLC如何實現通過MQTT協議物聯網網關接入管理云平臺

在工業4.0與智能制造浪潮下&#xff0c;企業亟需實現設備數據的高效采集與云端協同&#xff0c;以支撐遠程監控、預測性維護等場景。工業智能網關憑借其強大的協議解析能力、邊緣計算功能及安全傳輸機制&#xff0c;成為PLC接入云平臺的核心解決方案。本文將從技術架構、功能模…

通過sealos工具在ubuntu 24.02上安裝k8s集群

一、系統準備&#xff08;1&#xff09;安裝openssh服務 sudo apt install openssh-server sudo systemctl start ssh sudo systemctl enable ssh&#xff08;2&#xff09;放通防火墻 sudo ufw allow ssh&#xff08;3&#xff09;開通root直接登錄 vim /etc/ssh/sshd_config#…

nginx+Lua環境集成、nginx+Lua應用

nginxluaredis實踐 概述 nginx、lua訪問redis的三種方式&#xff1a; 1。 HttpRedis模塊。 指令少&#xff0c;功能單一 &#xff0c;適合簡單的緩存。只支持get 、select命令。 2。 HttpRedis2Module模塊。 功能強大&#xff0c;比較靈活。 3。 lua-resty-redis庫 OpenResty。…

機器學習 K-Means聚類 無監督學習

目錄 K-Means 聚類&#xff1a;從原理到實踐的完整指南 什么是 K-Means 聚類&#xff1f; 應用場景舉例 K-Means 算法的核心原理 K-Means 算法的步驟詳解 可視化理解 K-Means 的優缺點分析 優點 缺點 如何選擇合適的 K 值&#xff1f; 1. 肘部法&#xff08;Elbow Me…