日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

双指针算法之滑动窗口 | 力扣76.最小覆盖字串

發布時間:2025/3/20 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 双指针算法之滑动窗口 | 力扣76.最小覆盖字串 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 本文講解力扣76.最小覆蓋字串問題
  • 主要用到的是滑動窗口的思想


目錄

    • 76.最小覆蓋字串
      • 題目:
      • 分析:
      • 步驟描述:
      • 復雜度分析:
      • 結果

76.最小覆蓋字串

題目:

給定字符串 S 以及字符串 T ,求 S 種 包含 T 的最短連續子字符串的長度

給你一個字符串 s 、一個字符串 t 。返回 s 中涵蓋 t 所有字符的最小子串。如果 s 中不存在涵蓋 t 所有字符的子串,則返回空字符串 “” 。
注意:如果 s 中存在這樣的子串,我們保證它是唯一的答案。

要求 時間復雜度 ≤ O(n)

分析:

首先,返回的是字符串類型,想到使用 substr函數 截取對應的子串

使用數組,映射 T 中的字符情況,標記字符存在與否、對應的數量

使用滑動窗口的解法,可以解決大部分字符串匹配的問題~

步驟描述:

  • L R 指針。都從最左端到最右端移動,且 L <= R,L 只能在R 左邊或者重合
  • 挪動指針,根據映射情況,找到滿足要求的窗口
  • 找到一個窗口,繼續挪動,不影響結果的情況下尋找其它滿足要求的窗口,取最小值
  • 挪動的時候,注意 L 指針會更新,所以會“拋出”窗口原來最左邊的字符,需要處理“如果窗口拋出的是T中存在的某個字符”這種情況
class Solution { public:string minWindow(string s, string T) {vector<int> chars(128,0); vector<bool> flag(128,false); // 記錄字符是否在 T 中存在// 映射 T 中的字符情況for(int i = 0; i < T.size(); ++i){flag[T[i]] = true;++chars[T[i]]; // 字符的數量}int cnt =0; // 判斷 T的字符是不是都找完了int l=0,min_l=0;int min_size=s.size()+1;for (int r = 0; r < s.size(); ++r) {if (flag[s[r]]) {if (--chars[s[r]] >=0) {++cnt;}// 窗口包含了全部字符之后, L 指針繼續后移,繼續尋找其它滿足情況,找最小窗口while (cnt == T.size()) {if (r-l+1 < min_size) {min_l = l;min_size = r-l+1;}// 窗口后挪,左邊會“拋出”// 如果拋出的是T中存在的某個字符if (flag[s[l]] && ++chars[s[l]] >0) {--cnt;}++l;}}}return min_size >s.size()?"":s.substr(min_l, min_size);} };

復雜度分析:

雖然代碼使用了 for 和 while嵌套,但是 while 只是用來滑動的,所以時間復雜度是滿足要求的 O(n)

結果

總結

以上是生活随笔為你收集整理的双指针算法之滑动窗口 | 力扣76.最小覆盖字串的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。