LeetCode 76題解析:滑動窗口與哈希表實(shí)現(xiàn)最小覆蓋子串
1. 題目解析與核心思路LeetCode 76題最小覆蓋子串是算法面試中的經(jīng)典高頻題目也是Hot100題庫中的必刷題目。題目要求給定一個(gè)字符串S和一個(gè)字符串T在S中找出包含T所有字符的最短連續(xù)子串。這道題完美結(jié)合了滑動窗口和哈希表兩大核心算法思想是檢驗(yàn)面試者雙指針應(yīng)用能力的試金石。1.1 問題定義與示例給定兩個(gè)字符串S和T其中S是源字符串長度10^5級別T是目標(biāo)字符集合長度≤100 要求返回S中包含T所有字符包括重復(fù)字符的最短連續(xù)子串。如果不存在則返回空字符串。示例 輸入S ADOBECODEBANC, T ABC 輸出BANC 解釋BANC包含A、B、C且是滿足條件的最短子串1.2 暴力解法分析最直觀的解法是枚舉所有可能的子串檢查是否包含T的所有字符。對于長度為n的S子串總數(shù)是O(n^2)每個(gè)子串檢查需要O(m)時(shí)間m為T長度總時(shí)間復(fù)雜度O(n^2*m)顯然無法通過LeetCode測試。1.3 滑動窗口思想滑動窗口是處理子串/子數(shù)組問題的利器?;舅悸酚米笥抑羔樉S護(hù)一個(gè)窗口[l, r]右指針擴(kuò)展窗口直到滿足條件左指針收縮窗口優(yōu)化解記錄滿足條件的最小窗口對于本題的特殊性在于需要統(tǒng)計(jì)字符頻率T可能有重復(fù)字符窗口需要包含T所有字符包括重復(fù)次數(shù)2. 算法實(shí)現(xiàn)與優(yōu)化2.1 哈希表輔助統(tǒng)計(jì)使用兩個(gè)哈希表分別記錄needT中各字符出現(xiàn)次數(shù)目標(biāo)頻率window當(dāng)前窗口中各字符出現(xiàn)次數(shù)關(guān)鍵判斷條件 當(dāng)window包含所有need中的字符且對應(yīng)計(jì)數(shù)≥need時(shí)窗口滿足條件from collections import defaultdict def minWindow(s: str, t: str) - str: need defaultdict(int) window defaultdict(int) for c in t: need[c] 1 left right 0 valid 0 # 滿足條件的字符數(shù) start, length 0, float(inf) while right len(s): c s[right] right 1 if c in need: window[c] 1 if window[c] need[c]: valid 1 while valid len(need): if right - left length: start left length right - left d s[left] left 1 if d in need: if window[d] need[d]: valid - 1 window[d] - 1 return s[start:startlength] if length ! float(inf) else 2.2 復(fù)雜度分析時(shí)間復(fù)雜度O(n)左右指針各遍歷一次字符串每個(gè)字符最多被訪問兩次右指針擴(kuò)展、左指針收縮空間復(fù)雜度O(m)m為字符集大小ASCII最多1282.3 邊界條件處理需要特別注意的邊界情況S長度小于T時(shí)直接返回空T為空字符串時(shí)返回空S中不包含T所有字符時(shí)返回空多個(gè)解存在時(shí)返回第一個(gè)最小子串3. 關(guān)鍵技巧與優(yōu)化點(diǎn)3.1 有效字符過濾當(dāng)S中存在大量不在T中的字符時(shí)可以先預(yù)處理S記錄所有在T中出現(xiàn)字符的位置減少無效比較filtered_s [(i, c) for i, c in enumerate(s) if c in need]3.2 變量命名技巧使用有意義的變量名提升代碼可讀性valid已滿足條件的字符數(shù)need_cnt還需要匹配的字符總數(shù)替代valid3.3 循環(huán)不變式維護(hù)在滑動窗口算法中必須確保每次右移right后window狀態(tài)正確更新每次左移left前當(dāng)前解已被記錄移動left后window狀態(tài)同步更新4. 常見錯(cuò)誤與調(diào)試技巧4.1 典型錯(cuò)誤案例忘記處理T中字符重復(fù)的情況錯(cuò)誤僅檢查字符是否存在正確需要檢查字符出現(xiàn)次數(shù)窗口收縮條件錯(cuò)誤錯(cuò)誤valid len(t)正確valid len(need)考慮重復(fù)字符索引越界問題錯(cuò)誤while left right時(shí)未檢查邊界正確添加保護(hù)條件4.2 調(diào)試打印技巧在關(guān)鍵位置添加調(diào)試輸出print(fl{left}, r{right}, valid{valid}, window{dict(window)})4.3 測試用例設(shè)計(jì)必須包含的測試場景常規(guī)情況有解無解情況多個(gè)解存在T有重復(fù)字符S和T完全相同S和T都為空5. 同類題目拓展掌握最小覆蓋子串后可以解決一系列滑動窗口變種題無重復(fù)字符的最長子串LeetCode 3字符串排列LeetCode 567找到字符串中所有字母異位詞LeetCode 438最長湍流子數(shù)組LeetCode 978這些題目都可以使用類似的滑動窗口框架只需調(diào)整窗口移動條件和狀態(tài)判斷邏輯。關(guān)鍵心得滑動窗口問題的核心在于確定何時(shí)擴(kuò)展窗口、何時(shí)收縮窗口以及如何高效維護(hù)窗口狀態(tài)。建議先寫出框架再填充具體條件。

相關(guān)新聞

OpCore Simplify:黑蘋果配置的終極自動化指南

OpCore Simplify:黑蘋果配置的終極自動化指南

OpCore Simplify:黑蘋果配置的終極自動化指南 【免費(fèi)下載鏈接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 項(xiàng)目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 你是否曾經(jīng)因?yàn)閺?fù)雜的OpenCore配置而頭疼&am…

2026/7/29 15:37:18 閱讀更多
扣子循環(huán)+條件分支組合設(shè)計(jì):用狀態(tài)機(jī)思維重構(gòu)復(fù)雜流程(含可復(fù)用DSL模板)

扣子循環(huán)+條件分支組合設(shè)計(jì):用狀態(tài)機(jī)思維重構(gòu)復(fù)雜流程(含可復(fù)用DSL模板)

更多請點(diǎn)擊: https://intelliparadigm.com 第一章:扣子循環(huán)條件分支組合設(shè)計(jì):用狀態(tài)機(jī)思維重構(gòu)復(fù)雜流程(含可復(fù)用DSL模板) 傳統(tǒng)流程控制常陷入“嵌套地獄”——多層 if-else 與 for 循環(huán)交織,導(dǎo)致邏輯耦合…

2026/7/29 15:37:18 閱讀更多
企業(yè)架構(gòu)管理軟件和畫架構(gòu)圖工具有什么區(qū)別?

企業(yè)架構(gòu)管理軟件和畫架構(gòu)圖工具有什么區(qū)別?

畫架構(gòu)圖工具解決“這張圖怎么畫”,企業(yè)架構(gòu)管理軟件解決“對象、關(guān)系和治理過程怎么長期維護(hù)”。一次方案討論用 Visio、ProcessOn 或?qū)I(yè)建模工具通常夠用;當(dāng)同一對象要跨視圖復(fù)用,多部門共同維護(hù),系統(tǒng)變更還要做影響分析和評審…

2026/7/29 16:27:24 閱讀更多
上市公司投資者情緒數(shù)據(jù)分析與應(yīng)用指南

上市公司投資者情緒數(shù)據(jù)分析與應(yīng)用指南

1. 項(xiàng)目背景與數(shù)據(jù)價(jià)值 2007-2024年上市公司投資者情緒數(shù)據(jù),是一份橫跨中國資本市場18年發(fā)展歷程的珍貴數(shù)據(jù)集。作為二級市場研究的"情緒溫度計(jì)",這類數(shù)據(jù)能直觀反映投資者對上市公司的集體心理預(yù)期變化。我在量化投資領(lǐng)域工作12年&#xff0c…

2026/7/29 16:27:24 閱讀更多
AI制度文檔編寫不是寫作文!用NLP+ISO/IEC 23053雙引擎驅(qū)動的12項(xiàng)結(jié)構(gòu)化校驗(yàn)清單

AI制度文檔編寫不是寫作文!用NLP+ISO/IEC 23053雙引擎驅(qū)動的12項(xiàng)結(jié)構(gòu)化校驗(yàn)清單

更多請點(diǎn)擊: https://intelliparadigm.com 第一章:AI制度文檔編寫不是寫作文!用NLPISO/IEC 23053雙引擎驅(qū)動的12項(xiàng)結(jié)構(gòu)化校驗(yàn)清單 AI制度文檔的本質(zhì)是可執(zhí)行、可審計(jì)、可驗(yàn)證的治理契約,而非文學(xué)性表達(dá)。將自然語言處理&#xf…

2026/7/29 16:27:24 閱讀更多
HarmonyOS 應(yīng)用開發(fā)《掌上英語》第60篇:應(yīng)用啟動優(yōu)化——從 Ability 創(chuàng)建到首頁首屏渲染

HarmonyOS 應(yīng)用開發(fā)《掌上英語》第60篇:應(yīng)用啟動優(yōu)化——從 Ability 創(chuàng)建到首頁首屏渲染

應(yīng)用啟動優(yōu)化——從 Ability 創(chuàng)建到首頁首屏渲染一、啟動過程的三個(gè)階段 HarmonyOS 應(yīng)用的啟動過程可以分為三個(gè)階段: Ability 創(chuàng)建階段:從用戶點(diǎn)擊應(yīng)用圖標(biāo)到 onCreate 被調(diào)用窗口創(chuàng)建階段:從 onWindowStageCreate 到首幀內(nèi)容加載首屏渲染階…

2026/7/29 16:27:24 閱讀更多
面試官大笑:“一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,不比 1 個(gè)快 5 倍?“我搖頭:“快不了,還可能更慢“

面試官大笑:“一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,不比 1 個(gè)快 5 倍?“我搖頭:“快不了,還可能更慢“

前兩個(gè)月,我在重構(gòu) AlgoMooc 網(wǎng)站過程中,發(fā)現(xiàn)一個(gè)問題:在 Claude Code 里把一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,結(jié)果可能比 1 個(gè) agent 從頭干到尾還慢? 大多數(shù)人的第一反應(yīng)是反過來的:活是并行干的&#…

2026/7/29 0:15:24 閱讀更多
# 鴻蒙 HarmonyOS 應(yīng)用開發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號與動畫渲染精講

# 鴻蒙 HarmonyOS 應(yīng)用開發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號與動畫渲染精講

一、應(yīng)用概述 骰子(Dice Roller) 是一款經(jīng)典的休閑娛樂應(yīng)用,模擬了真實(shí)擲骰子的過程。應(yīng)用投擲兩個(gè)骰子(六面標(biāo)準(zhǔn)骰),使用 Unicode 骰面符號直觀展示每個(gè)骰子的點(diǎn)數(shù),并伴有快速滾動的動畫效果。…

2026/7/29 0:15:24 閱讀更多