2.7 滑動窗口專題:串聯所有單詞的子串

LeetCode 30. 串聯所有單詞的子串算法對比分析


1. 題目鏈接

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


2. 題目描述

給定一個字符串 s 和一個字符串數組 wordswords 中所有單詞長度相同。要求找到 s 中所有起始索引,使得從該位置開始的連續子串包含 words 中所有單詞的某種排列(不限制順序)。
示例
輸入:s = "barfoothefoobarman", words = ["foo","bar"]
輸出:[0,9](子串 "barfoo""foobar" 符合條件)。


3. 算法思路

滑動窗口法

  1. 問題轉化:將 words 的排列匹配問題轉化為固定窗口長度的滑動窗口問題。
  2. 哈希表統計:用 hash1 記錄 words 中單詞的出現次數,hash2 記錄當前窗口內單詞的出現次數。
  3. 多起點遍歷:由于單詞長度固定為 nwSub,需遍歷 nwSub 種可能的起始偏移(0 ≤ i < nwSub)。
  4. 窗口動態調整
    • 右指針擴展:每次截取一個單詞加入窗口,更新哈希表。
    • 左指針收縮:當窗口內單詞數量超過 nw 時,移動左指針。
  5. 結果判斷:當窗口內單詞數量等于 nw 且所有單詞頻率匹配時,記錄起始索引。

暴力枚舉法

  1. 遍歷所有子串:枚舉所有長度為 nw * nwSub 的子串。
  2. 分割統計:將子串分割為 nw 個單詞,統計頻率是否與 words 一致。

4. 示例分析

輸入:s = "barfoothefoobarman", words = ["foo","bar"]

  1. 暴力枚舉法

    • 枚舉所有長度為 6 的子串,例如 "barfoo", "arfoot", "rfooth" 等。
    • 對每個子串分割為 ["bar","foo"]["arf","oot"],檢查是否與 words 匹配。
  2. 滑動窗口法

    • i=0 時,窗口從 left=0 開始,截取 "bar""foo"count=2,記錄索引 0。
    • i=9 時,窗口從 left=9 開始,截取 "foo""bar"count=2,記錄索引 9。

5. 邊界條件與注意事項
  1. 單詞長度相同words 中所有單詞長度必須一致。
  2. 空輸入處理:若 words 為空或 s 長度不足,直接返回空。
  3. 哈希表更新:需在收縮窗口時及時減少 hash2 的計數,避免無效單詞干擾。

6. 代碼實現
class Solution 
{
public:vector<int> findSubstring(string s, vector<string>& words) {vector<int> ret;int ns = s.size(), nw = words.size(), nwSub = words[0].size();if (ns < nwSub * nw) return ret;unordered_map<string, int> hash1;for (auto& word : words) hash1[word]++;for (int i = 0; i < nwSub; i++) { // 遍歷所有可能的起始偏移unordered_map<string, int> hash2;int left = i, count = 0; // left為窗口左邊界for (int right = i; right + nwSub <= ns; right += nwSub) {// 截取當前單詞string in = s.substr(right, nwSub);hash2[in]++;// 更新有效計數:僅在當前單詞屬于hash1且未超過次數時增加countif (hash1.count(in) && hash2[in] <= hash1[in]) count++;// 當窗口內的單詞數量超過nw時,收縮左邊界while ((right - left) / nwSub + 1 > nw) {string out = s.substr(left, nwSub);if (hash1.count(out) && hash2[out] <= hash1[out]) count--;hash2[out]--;left += nwSub; // 左指針移動一個單詞長度}// 若有效計數等于nw,記錄起始索引if (count == nw) ret.push_back(left);}}return ret;}
};

在這里插入圖片描述


7.暴力枚舉法與滑動窗口法對比圖表
對比維度暴力枚舉法滑動窗口法
核心思想枚舉所有長度為 nw * nwSub 的子串,分割后比較單詞頻率。維護固定窗口長度,動態調整窗口內的單詞頻率。
時間復雜度O(ns * nw * nwSub)(每個子串需分割并統計頻率)。O(ns * nwSub)(每個單詞被處理一次)。
空間復雜度O(nw)(存儲 words 的哈希表)。O(nw)(存儲兩個哈希表)。
實現方式雙重循環遍歷子串,內層循環分割并統計。單層循環擴展右指針,動態調整左指針。
適用場景小規模數據(ns ≤ 1e3, nw ≤ 10)。大規模數據(ns ≤ 1e5)。
優點邏輯簡單,直接窮舉所有可能性。時間復雜度低,適用于大規模數據。
缺點數據規模大時性能極差(例如 ns=1e4 時需 1e8 次操作)。需處理哈希表的動態更新和邊界條件。

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

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

相關文章

【區塊鏈】區塊鏈密碼學基礎

&#x1f308;個人主頁: 鑫寶Code &#x1f525;熱門專欄: 閑話雜談&#xff5c; 炫酷HTML | JavaScript基礎 ?&#x1f4ab;個人格言: "如無必要&#xff0c;勿增實體" 文章目錄 區塊鏈密碼學基礎引言一、哈希函數1.1 基本概念1.2 數學表達 二、非對稱加密2.1…

Spring Boot配置類原理、Spring Boot核心機制理解,以及實現自動裝置的底層原理

目的:從底層源碼角度分析 Spring Boot 配置類以及自動裝載的底層原理 文章目錄 1. Spring Boot 配置類實現自動裝載1.1 @Configuration注解1.2 @Configuration 注解完成 bean 注入流程圖1.3 @ConfigurationProperties注解賦值2. Spring Boot的核心機制:自動裝配2.1 @SpringBo…

docker桌面版啟動redis,解決無法連接

docker run -d --name redis -p 6379:6379 -v E:\2\redis\redis.conf:/usr/local/etc/redis/redis.conf redis redis-server /usr/local/etc/redis/redis.conf 在本地創建一個目錄&#xff0c;里面有個redis.conf文件&#xff0c;內容如下&#xff0c;啟動時綁定這個配置文件目…

[網絡][tcp協議]:tcp報頭

tcp(傳輸控制協議)是一種面向字節流的傳輸層協議,相較于udp協議,tcp能保證傳輸數據的可靠性與準確性,tcp也是目前最常見的傳輸層協議 本文主要介紹tcp報頭各個字段的含義與用途 注:保留6位和6位標記位是目前最普遍的寫法,在我查資料時,發現有一些拓展情況,會在后文細說 最簡單的…

【虛幻C++筆記】引擎源碼下載及編譯步驟

目錄 1.在GitHub上訪問虛幻引擎源代碼2.安裝Visual Studio 20223.解壓完成以后&#xff0c;打開源碼的根目錄&#xff0c;選擇Setup.bat運行4.選擇GenerateProjectFiles.bat運行,生成uE5.sln文件&#xff0c;點擊這個文件打開項目5.設置編譯的選項&#xff0c;選擇DevelopmentE…

【數學建模】層次分析法(AHP)詳解及其應用

層次分析法(AHP)詳解及其應用 引言 在現實生活和工作中&#xff0c;我們經常面臨復雜的決策問題&#xff0c;這些問題通常涉及多個評價準則&#xff0c;且各準則之間可能存在相互影響。如何在這些復雜因素中做出合理的決策&#xff1f;層次分析法(Analytic Hierarchy Process…

科普:為何要對特征進行分箱?

一、為何要對特征進行分箱&#xff1f; 分箱&#xff08;Binning&#xff09;是將連續型或離散型特征轉化為區間型變量的過程&#xff0c;其核心目標是提升模型效果和解釋性&#xff0c;具體原因如下&#xff1a; 1. 業務需求 可解釋性&#xff1a;將特征轉化為業務可理解的…

理解langgraph工作流的驅動邏輯,以適應langgraph工作流模式的編程。

langgraph的工作流模式雖然方便直觀&#xff0c;但習慣了普通函數式編程的數據流處理。剛開始接觸時&#xff0c;確實容易試圖用函數式編程的思維去適配它&#xff0c;特別是langgraph數據傳遞由狀態字典管理&#xff0c;而非函數返回值&#xff0c;導致代碼不夠自然&#xff0…

線性dp(數字三角形,LIS,LCS,LCIS)

文章目錄 線性dp數字三角形題目思路 LIS&#xff08;最長上升子序列&#xff09;代碼&#xff08;n^2&#xff09;二分優化&#xff08;nlogn&#xff09; LCS(最長公共子序列)代碼 LCS——>>LIS思路代碼 最長公共子串最長公共上升子序列&#xff08;LCIS&#xff09; 線…

Spring Validation參數校驗

Spring Validation是Spring框架中用于數據校驗的核心模塊&#xff0c;通過注解簡化數據校驗邏輯。 1. 依賴引入&#xff08;SpringBoot項目&#xff09; Spring Boot項目&#xff1a;自動包含spring-boot-starter-validation <dependency><groupId>org.springfra…

《AI大模型趣味實戰》No2 : 快速搭建一個漂亮的AI家庭網站-相冊/時間線/日歷/多用戶/個性化配色(中)

快速搭建一個漂亮的AI家庭網站-相冊/時間線/日歷/多用戶/個性化配色(中) 摘要 在上一篇文章中&#xff0c;我們介紹了如何搭建一個基礎的家庭網站&#xff08;V1.0版本&#xff09;&#xff0c;包含了用戶管理、相冊管理、時間線和日歷等功能。本文將繼續深入&#xff0c;詳細…

pythonSTL---sys

sys 是 Python 標準庫中的一個內置模塊&#xff0c;它提供了許多與 Python 解釋器和系統環境進行交互的功能。 sys方法 1. 導入 sys 模塊 在使用 sys 庫的功能之前&#xff0c;需要先導入它&#xff1a; import sys2. 命令行參數 (sys.argv) sys.argv 是一個包含命令行參數…

軟件需求分類、需求獲取(高軟46)

系列文章目錄 軟件需求分類&#xff0c;需求獲取 文章目錄 系列文章目錄前言一、軟件需求二、獲取需求三、真題總結 前言 本節講明軟件需求分類、需求獲取的相關知識。 一、軟件需求 二、獲取需求 三、真題 總結 就是高軟筆記&#xff0c;大佬請略過&#xff01;

Zabbix7.0+DeepSeek大模型實現人工智能告警分析

一、方案概述 本方案基于Zabbix7.0監控系統,通過底層webhook腳本機制集成Deepseek做故障分析提供解決方案,構建智能化運維體系。 其核心架構包括: Zabbix監控平臺:負責實時監控和告警觸發 Webhook接口:實現告警信息的傳遞 Deepseek AI平臺:提供故障智能分析能力 二、…

CPU相關:實時cpu信息接口

[rootxxx ~]# cat /proc/cpuinfo #通過實時cpu信息接口查看cpu信息

Certbot實現SSL免費證書自動續簽(CentOS 7版 + Docker部署的nginx)

前置安裝&#xff0c;可參考Certbot實現SSL免費證書自動續簽&#xff08;CentOS 7 nginx/apache&#xff09; 如果是通過 Docker 運行 Nginx&#xff0c; certbot 無法直接檢測到本地的 Nginx 配置。解決方案是 使用 standalone 模式 或 掛載 Webroot 方式獲取 SSL 證書&…

A SURVEY ON POST-TRAINING OF LARGE LANGUAGE MODELS——大型語言模型的訓練后優化綜述——第2部分

3、微調&#xff08;上一部分內容&#xff09; 4、LLMs的對齊 大型語言模型&#xff08;LLMs&#xff09;中的對齊涉及引導模型輸出以符合人類預期和偏好&#xff0c;特別是在安全關鍵或用戶面對的應用程序中。本章討論了實現對齊的三個主要范式&#xff1a; 帶有反饋的人工…

熱key探測技術架構設計與實踐

參考&#xff1a; 得物熱點探測技術架構設計與實踐 Redis數據傾斜與JD開源hotkey源碼分析揭秘 京東熱點檢測 HotKey 學習筆記 hotkey: 京東App后臺中間件&#xff0c;毫秒級探測熱點數據&#xff0c;毫秒級推送至服務器集群內存&#xff0c;大幅降低熱key對數據層查詢壓力 …

Windows 環境圖形化安裝 Oracle 23ai

文章目錄 Windows 環境安裝23ai下載Oracle 23ai安裝包安裝安裝詳細圖形界面連接Oracle 23ai 安裝過程中遇到的錯誤安裝過其他版本數據庫&#xff0c;設置了ORACLE_HOME或 TNS_ADMIN解決方法 無法訪問Windows Installer Serviece (error 1719)解決方法 其他注意 參考&#xff1a…

RabbitMQ支持的復雜的消息交換模式

RabbitMQ支持多種復雜的消息交換模式&#xff0c;這些模式通過不同的交換機類型和隊列特性實現&#xff0c;能夠滿足多樣化的業務需求。以下是RabbitMQ支持的主要復雜消息交換模式&#xff1a; 1. Direct Exchange&#xff08;直連交換機&#xff09; 直連交換機根據消息的路由…