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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【LeetCode笔记】76. 最小覆盖子串(字符串、滑动窗口)

發布時間:2024/7/23 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【LeetCode笔记】76. 最小覆盖子串(字符串、滑动窗口) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 題目描述
  • 思路 && 代碼
      • 二刷

最近一直在充電基礎知識、維護 leetcode 總結博客
今天繼續摸一摸新題目吧~

題目描述

  • 感覺和 03. 無重復的最長子串 有點像,都是在字符串上用滑動窗口來找子串
  • 并且都是屬于那種,解決一次以后,思路都十分清晰的類型。

思路 && 代碼

  • 步驟:參考了mcdull的這篇題解
  • 注意點:需要維護的變量很多(need、left、right、count、minSize、startIndex),要保證正確維護
  • need[128] :存儲當前滑動窗口,對每個字符還需要的數量。為0則正好,負數則說明冗余,正數則還需要。
  • 時間復雜度:O(n),也就是最多 right 跑一遍,left 跑一遍
class Solution {// 思路:滑動窗口 + 雙指針。正確維護幾個變量十分重要// 復雜度:最多為O(2 * n) = O(n)public String minWindow(String s, String t) {if(s == null || t == null || s.length() == 0 || t.length() == 0) {return "";}// need:總是記錄當前窗口,每個字符還需的數量。負數為冗余數量int[] need = new int[128];for(char c : t.toCharArray()) {need[c]++;}int count = t.length(), startIndex = 0, minSize = Integer.MAX_VALUE;for(int l = 0, r = 0; r < s.length(); r++) {if(need[s.charAt(r)] > 0) {count--;}need[s.charAt(r)]--;if(count == 0) {// 去掉窗口前段的冗余元素,更新 leftwhile(l < r && need[s.charAt(l)] < 0) {need[s.charAt(l)]++;l++;}// 維護 minSizeif(r - l + 1 < minSize) {minSize = r - l + 1;startIndex = l;}// 繼續下一輪的窗口對比need[s.charAt(l)]++;l++;count++;}}return minSize == Integer.MAX_VALUE ? "" : s.substring(startIndex, startIndex + minSize);} }

二刷

  • 實打實的滑動窗口維護
  • 總的來說還是幾個變量的維護,直接看代碼和注釋吧~
class Solution {public String minWindow(String s, String t) {// 記錄字符需要的數量,負數冗余int[] need = new int[128];for(char c : t.toCharArray()) {need[c]++;}int counts = t.length(), startIndex = 0, minSize = Integer.MAX_VALUE;for(int l = 0, r = 0; r < s.length(); r++) {// Part 1: 更新 counts && needif(need[s.charAt(r)] > 0) {counts--;}need[s.charAt(r)]--;// Part 2: 此時滿足的情況,更新窗口if(counts == 0) {// Part 2.1:去除前面的冗余字符while(l < r && need[s.charAt(l)] < 0) {need[s.charAt(l)]++;l++;}// Part 2.2:維護 minSizeif(r - l + 1 < minSize) {startIndex = l;minSize = r - l + 1;}// Part 2.3:進行下一輪維護need[s.charAt(l++)]++;counts++;}}return minSize == Integer.MAX_VALUE ? "" : s.substring(startIndex, startIndex + minSize);} }

總結

以上是生活随笔為你收集整理的【LeetCode笔记】76. 最小覆盖子串(字符串、滑动窗口)的全部內容,希望文章能夠幫你解決所遇到的問題。

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