LeetCode.30 串聯所有單詞的子串

問題描述

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

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

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

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

解題思路

1. 初步理解

首先需要明確,只有當 s 中的某個子串正好由 words 中所有單詞組成,并且每個單詞出現一次,才符合條件。這提示我們可以使用組合和檢查的策略來找到這些子串。

2. 設計策略

基于以上理解,可以采用以下策略:

  • 長度計算: 計算 words 中所有字符串連接后的總長度,這將是我們在 s 中搜索的子串的長度。
  • 字典統計: 使用一個哈希表(字典)來統計 words 數組中每個單詞的出現頻率。
  • 滑動窗口: 在字符串 s 上滑動一個固定大小的窗口,并在窗口內部維護一個字典來記錄當前窗口中各單詞的出現頻率。
  • 窗口調整: 根據窗口內單詞的實際出現情況,調整窗口的開始位置,確保窗口內的單詞頻率與 words 中的單詞頻率相匹配。

3. 實現細節

  • 初始化: 計算每個單詞的長度 wordLength,所有單詞的數量 wordCount,以及應搜索的窗口大小 windowSize
  • 遍歷: 遍歷字符串 s 的每個可能的起始位置,步長為 wordLength
  • 內部循環: 對每個起始位置,向右滑動窗口,每次移動一個單詞的長度,直到窗口尾部超出字符串 s 的邊界。
  • 檢查與調整: 每次窗口滑動后,更新當前單詞在窗口中的計數,并與 words 字典進行比較,如果當前單詞計數超過了應有的頻率,則調整窗口的左邊界,直至窗口內的單詞頻率再次符合要求。
  • 記錄結果: 如果窗口大小達到了 windowSize,且窗口內的單詞與 words 中的單詞完全匹配,則記錄當前窗口的起始位置。

代碼實現

class Solution {
public:vector<int> findSubstring(string s, vector<string>& words) {vector<int> indices;if (s.empty() || words.empty())return indices;int wordLength = words[0].size();int wordCount = words.size();int windowSize = wordLength * wordCount;if (s.size() < windowSize)return indices;// 記錄words中每個單詞出現的次數unordered_map<string, int> wordMap;for (const string& word : words) {++wordMap[word];}// 檢查每個可能的開始位置for (int i = 0; i < wordLength; ++i) {int left = i;int right = i;unordered_map<string, int> currentMap;while (right + wordLength <= s.size()) {string word = s.substr(right, wordLength);right += wordLength;if (wordMap.find(word) != wordMap.end()) {++currentMap[word];// 處理單詞出現次數過多的情況while (currentMap[word] > wordMap[word]) {string leftWord = s.substr(left, wordLength);--currentMap[leftWord];left += wordLength;}// 檢查是否形成了一個有效的窗口if (right - left == windowSize) {indices.push_back(left);string leftWord = s.substr(left, wordLength);--currentMap[leftWord];left += wordLength;}} else {currentMap.clear();left = right;}}}return indices;}
};

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

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

相關文章

MySQL Workbench支持哪些數據庫版本的連接?

MySQL Workbench支持哪些數據庫版本的連接&#xff1f; MySQL Workbench 是一款強大的數據庫管理和設計工具&#xff0c;它支持連接多種版本的 MySQL 數據庫。包括但不限于&#xff1a; MySQL 官方發行的所有版本&#xff0c;從 MySQL 5.0 到最新的 MySQL 8.x 和更高版本。 M…

Linux - 札記 - W10: Warning: Changing a readonly file

Linux - 札記 - W10: Warning: Changing a readonly file 這里寫目錄標題 一、問題描述1. 現象2. 原因 二、解決方案 一、問題描述 1. 現象 在使用 vim 編輯文件時&#xff08;我這里是要編輯 /root/.ssh/authorized_keys&#xff09;提示&#xff1a;W10: Warning: Changing…

【論文+代碼|已完結】基于人工智能的圖像識別技術在醫療診斷中的應用

基于人工智能的圖像識別技術在醫療診斷中的應用 摘要&#xff1a;隨著人工智能技術的飛速發展&#xff0c;圖像識別技術在醫療領域的應用日益廣泛。本畢業設計旨在研究基于人工智能的圖像識別技術在醫療診斷中的應用&#xff0c;通過對大量醫療圖像數據的分析和處理&#xff0…

IOS Swift 從入門到精通:ios 連接數據庫 安裝 Firebase 和 Firestore

創建 Firebase 項目 導航到Firebase 控制臺并創建一個新項目。為項目指定任意名稱。 在這里插入圖片描述 下一步,啟用 Google Analytics,因為我們稍后會用到它來發送推送通知。 在這里插入圖片描述 在下一個屏幕上,選擇您的 Google Analytics 帳戶(如果已創建)。如果沒…

<電力行業> - 《第7課:發電》

1 發電的原理 電力生產的發電環節是利用電能生產設備將各種一次能源或其他形式的能轉換為電能。生產電能的主要方式有火力發電、水力發電、核能發電、地熱發電、風力發電、太陽能發電、潮汐能發電、生物智能發電和燃料電池發電等。 除太陽能發電的光伏電池技術和燃料電池發電…

c++ 子類繼承父類

這個是子類繼承父類 是否重寫從父類那里繼承來的函數 這個例子的路徑 E盤 demo文件夾 fatherChildfunc

藍卓出席“2024C?O大會”,探討智能工廠建設新路徑

6月29日&#xff0c;“2024C?O大會”在金華成功舉辦。此次大會由浙江省企業信息化促進會主辦&#xff0c;與以往CIO峰會不同&#xff0c;“C?O”代表了企業數字化中的核心決策者群體&#xff0c;包括傳統的CIO、CEO、CDO等。 本次大會圍繞C?O、AIGC與制造業、數據價值、未來…

統計信號處理基礎 習題解答11-9

一個飛行器開始于一個未知位置(, )&#xff0c;按照 以常速運動&#xff0c;其中, 分別是飛行器在x、y方向的速度分量,都是未知的。我們希望估計每一時刻, 飛行器的位置和速度。盡管初始位置(, )和速度, 都是未知的,但是它們可以看成一個隨機矢量。證明能夠由MMSE估計器估計為 …

libarclite_iphonesimulator.a‘; try increasing the minimum deployment target

1. Xcode 15 編譯出現以下錯誤 clang: error: SDK does not contain libarclite at the path /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a; try increasing the minimum deployment ta…

React+TS前臺項目實戰(二十一)-- Search業務組件封裝實現全局搜索

文章目錄 前言一、Search組件封裝1. 效果展示2. 功能分析3. 代碼詳細注釋4. 使用方式 二、搜索結果展示組件封裝1. 功能分析2. 代碼詳細注釋 三、引用到文件&#xff0c;自行取用總結 前言 今天&#xff0c;我們來封裝一個業務靈巧的組件&#xff0c;它集成了全局搜索和展示搜…

spring如何給bean動態取不同的別名

開源項目SDK&#xff1a;https://github.com/mingyang66/spring-parent 個人文檔&#xff1a;https://mingyang66.github.io/raccoon-docs/#/ spring、springboot向容器中注入bean的時候一般情況下只有一個別名&#xff0c;在某些特殊場景需要指定多個別名。 方案一&#xff1a…

v-if 和 v-show 的含義、使用方式及使用時的區別

學習內容&#xff1a; v-if 和 v-show 的含義、使用方式及使用時的區別&#xff1a; 例如&#xff1a; v-if 的含義v-if 的用法v-show 的含義v-show 的用法v-if 與 v-show 區別 知識小結&#xff1a; 小結 1、v-if v-if 是一種條件性地渲染元素的指令。當條件為真時&#…

ic基礎|功耗篇04:門級低功耗技術

大家好&#xff0c;我是數字小熊餅干&#xff0c;一個練習時長兩年半的IC打工人。我在兩年前通過自學跨行社招加入了IC行業。現在我打算將這兩年的工作經驗和當初面試時最常問的一些問題進行總結&#xff0c;并通過匯總成文章的形式進行輸出&#xff0c;相信無論你是在職的還是…

【chatgpt】npy文件和npz文件區別

npy文件和npz文件都是用于存儲NumPy數組的文件格式。它們的主要區別如下&#xff1a; npy文件&#xff1a;這種文件格式用于存儲單個NumPy數組。它是一種簡單的二進制文件格式&#xff0c;可以快速地讀寫NumPy數組。 npz文件&#xff1a;這種文件格式是一個壓縮包&#xff0c;…

《Windows API每日一練》6.2 客戶區鼠標消息

第五章已經講到&#xff0c;Windows只會把鍵盤消息發送到當前具有輸入焦點的窗口。鼠標消息則不同&#xff1a;當鼠標經過窗口或在窗口內被單擊&#xff0c;則即使該窗口是非活動窗口或不帶輸入焦點&#xff0c; 窗口過程還是會收到鼠標消息。Windows定義了 21種鼠標消息。不過…

UE5藍圖快速實現打開網頁與加群

藍圖節點&#xff1a;啟動URL 直接將對應的網址輸入&#xff0c;并使用即可快速打開對應的網頁&#xff0c;qq、discord等群聊的加入也可以直接通過該節點來完成。 使用后會直接打開瀏覽器。

第11章 規劃過程組(收集需求)

第11章 規劃過程組&#xff08;一&#xff09;11.3收集需求&#xff0c;在第三版教材第377~378頁&#xff1b; 文字圖片音頻方式 第一個知識點&#xff1a;主要輸出 1、需求跟蹤矩陣 內容 業務需要、機會、目的和目標 項目目標 項目范圍和 WBS 可…

【強化學習】第01期:緒論

筆者近期上了國科大周曉飛老師《強化學習及其應用》課程&#xff0c;計劃整理一個強化學習系列筆記。筆記中所引用的內容部分出自周老師的課程PPT。筆記中如有不到之處&#xff0c;敬請批評指正。 文章目錄 1.1 概述1.2 Markov決策過程1.2.1 Markov Process (MP) 馬爾科夫過程1…

(五)SvelteKit教程:錯誤頁和重定向

&#xff08;五&#xff09;SvelteKit教程&#xff1a;錯誤頁和重定向 設置404頁面和重定向非常容易&#xff0c;我們還是在 /about 目錄下學習這個知識&#xff0c;文件結構如下&#xff1a; ├── layout.svelte ├── page.svelte ├── about │ └── [aboutID] │…

基于深度學習的人臉關鍵點檢測

1. 任務和目標 人臉關鍵點檢測的主要任務是識別并定位人臉圖像中的特定關鍵點&#xff0c;例如眼睛的角點、眉毛的頂點、鼻子的底端、嘴角等。這些關鍵點不僅能提供面部結構的幾何信息&#xff0c;還可以用于分析表情、識別個體&#xff0c;甚至檢測面部姿勢。 2. 技術和方法…