Leetcode76覆蓋最小子串

覆蓋最小子串

  • 代碼來自b站左程云
class Solution {public String minWindow(String str, String tar) {char[] s = str.toCharArray();char[] t = tar.toCharArray();int[] cnt = new int[256];for (char cha : t) { cnt[cha]--;}int len = Integer.MAX_VALUE;int debt = t.length;int start = 0;for (int r = 0, l = 0; r < s.length; r ++) { if (cnt[s[r]]++ < 0) { debt--;}if (debt == 0) { while (cnt[s[l]] > 0) { cnt[s[l++]]--;}if (r - l + 1 < len) { len = r - l + 1;start = l;}}}return len == Integer.MAX_VALUE ? "" : str.substring(start, start + len);}
}

畫圖理解題意

  • 我們先梳理一下思路:
  1. 我們要確定這個窗口有沒有包含target字符串中的每一個字符,難道我們要遍歷比較嗎?顯然不行,那么怎么樣讓它遍歷一次就知道是否包含呢?
  2. 我們利用之前前綴和中哈希表的思路,我們把target字符串的每個字符出現的次數作為每個字符欠債的個數存到數組中,把它弄成一個前債表。
  • 我們看第一個樣例:
    在這里插入圖片描述

初始的欠債表為:

說明此時我們要找到一個滿足ABC每個字符各一個的組合。


當我們不斷擴展右邊界,會發現第一次滿足條件的窗口是這樣的:

在這里插入圖片描述
可是題目要我們求最短啊,我們嘗試收縮左邊界,收縮的時候要注意,如果收縮會導致欠債那么就不能收縮,只能記住答案,拿去與之前比大小看是否能更新。

然后繼續擴展右邊界:
在這里插入圖片描述

此時我們發現,不僅不欠債還有了結余可以嘗試收縮。

繼續這樣推下去,就是不斷進行這個判斷過程:
在這里插入圖片描述

理解代碼:

    if (cnt[s[r]]++ < 0) { debt--;}

這里是把每一個字符扔到欠債表里面進行結算,如果是target里面的,說明他剛開始是負的,所以我們用是否小于0來判斷是否可以對欠債總數debt來進行削減,到0的時候就說明我們要開始嘗試收縮窗口了。

          if (debt == 0) { while (cnt[s[l]] > 0) { cnt[s[l++]]--;}if (r - l + 1 < len) { len = r - l + 1;start = l;}}

要判斷左邊是否可以削減,就要看它的削減會不會導致債務的增加,也就是會不會導致現在的窗口不能完全包含target,所以進行此判斷。

然后我們就要看這個窗口長度是不是目前最短的,是的話就更新它,同時記住此時左邊界,為什么?因為我們要返回的是一個字符串,截取一個子串需要它的長度和起始位置。

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

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

相關文章

Linux du 命令終極指南:從基礎到精通

文章目錄 Linux du 命令終極指南&#xff1a;從基礎到精通du 命令簡介常用參數詳解常見用法示例查看當前目錄總大小查看當前目錄及其子目錄占用空間只顯示當前目錄總占用空間查看目錄下每個文件和子目錄的大小查看某目錄深度為 1 的大小分布查看某目錄并排除日志文件查看多個目…

sychronized原理(嚼碎了喂版)

先說一下心得吧&#xff0c;我們知道硬軟不分家&#xff0c;在學習底層原理的時候我們不需要死扣到底&#xff0c;沒必要把硬件方面全吃透&#xff0c;點到為止&#xff0c;學到能夠幫助理解代碼即可&#xff0c;我們的目標是寫出高性能的代碼&#xff0c;而不是創造出硬軟一體…

Ngrok 配置:實現 Uniapp 前后端項目內網穿透

文章目錄 一、下載并安裝 ngrok二、配置 ngrok Authtoken三、啟動本地 uniapp 項目四、使用 ngrok 暴露本地服務五、通過公網 URL 訪問項目六、后端API項目的穿透問題排查 (uni-app 后端 API 示例)交互流程圖示 七、ngrok Web 界面 (本地監控)八、停止 ngrok總結 ngrok 是一款…

k8s灰度發布

基于 Traefik 的加權灰度發布-騰訊云開發者社區-騰訊云 Traefik | Traefik | v1.7 Releases traefik/traefik GitHub 從上面連接下載后上傳到harbor虛擬機 vagrant upload /C/Users/HP280/Downloads/traefik 下載配置文件 wget -c http://raw.githubusercontent.com/conta…

win10-django項目與mysql的基本增刪改查

以下都是在win10系統下&#xff0c;django項目的orm框架對本地mysql的表的操作 models.py----->即表對應的類所在的位置 在表里新增數據 1.引入表對應的在models.py中的類class 2.在views.py中使用函數&#xff1a;類名.objects.create(字段名值,字段名"值"。。。…

`ParameterizedType` 和 `TypeVariable` 的區別

在 Java 的泛型系統中&#xff0c;ParameterizedType 和 TypeVariable 是兩個不同的類型表示&#xff0c;它們都屬于 java.lang.reflect.Type 接口的子接口。兩者都在反射&#xff08;Reflection&#xff09;中用于描述泛型信息&#xff0c;但用途和含義不同。 &#x1f31f; 一…

PR-2021

推薦深藍學院的《深度神經網絡加速&#xff1a;cuDNN 與 TensorRT》&#xff0c;課程面向就業&#xff0c;細致講解CUDA運算的理論支撐與實踐&#xff0c;學完可以系統化掌握CUDA基礎編程知識以及TensorRT實戰&#xff0c;并且能夠利用GPU開發高性能、高并發的軟件系統&#xf…

unity使用ZXing.Net生成二維碼

下載鏈接 https://github.com/micjahn/ZXing.Net 放到Plugins下即可使用

Ubuntu 編譯SRS和ZLMediaKit用于視頻推拉流

SRS實現視頻的rtmp webrtc推流 ZLMediaKit編譯生成MediaServer實現rtsp推流 SRS指定某個固定網卡&#xff0c;修改程序后重新編譯 打開SRS-4.0.0/trunk/src/app/srs_app_rtc_server.cpp&#xff0c;在 232 行后面添加&#xff1a; ZLMediaKit編譯后文件存放在ZLMediakit/rele…

如何備考GRE?

1.引言 GRE和雅思不太相同&#xff0c;首先GRE是美國人的考試&#xff0c;思維方式和很多細節和英系雅思不一樣。所以底層邏輯上我覺得有點區別。 難度方面&#xff0c;我感覺GRE不容易考低分&#xff0c;但考高分較難。雅思就不一樣了不僅上限難突破&#xff0c;下限還容易6…

uniapp|商品列表加入購物車實現拋物線動畫效果、上下左右拋入、多端兼容(H5、APP、微信小程序)

以uniapp框架為基礎,詳細解析商品列表加入購物車拋物線動畫的實現方案。通過動態獲取商品點擊位置與購物車坐標,結合CSS過渡動畫模擬拋物線軌跡,實現從商品圖到購物車圖標的動態效果。 目錄 核心實現原理坐標動態計算拋物線軌跡模擬?動畫元素控制代碼實現詳解模板層設計腳本…

React中使用openLayer畫地圖

OpenLayers&#xff08;簡稱ol&#xff09;是一個?開源的WebGIS前端開發庫?&#xff0c;基于JavaScript實現&#xff0c;主要用于在網頁中嵌入動態二維地圖。 官方網站&#xff1a; https://openlayers.org 中文官網&#xff1a; https://openlayers.vip 大家可以去參考學習…

WHAT - 緩存命中 Cache Hit 和緩存未命中 Cache Miss

文章目錄 一、什么是緩存命中&#xff1f;二、前端開發要知道哪些緩存機制&#xff08;以及命中條件&#xff09;&#xff1f;1. 瀏覽器緩存&#xff08;主要針對靜態資源&#xff09;常見的緩存位置關鍵 HTTP 頭字段&#xff08;決定命中與否&#xff09; 2. 前端應用層緩存&a…

10 個可靠的 Android 文件傳輸應用程序

Android 文件傳輸是 Android 用戶的常見需求。我們經常需要將文件從一臺 Android 設備傳輸到 PC 或 Mac。但我們怎樣才能做到這一點呢&#xff1f;俗話說&#xff0c;工欲善其事&#xff0c;必先利其器。因此&#xff0c;首先了解 10 個鋒利的 Android 文件傳輸應用程序&#x…

AlphaEvolve:LLM驅動的算法進化革命與科學發現新范式

AlphaEvolve&#xff1a;LLM驅動的算法進化革命與科學發現新范式 本文聚焦Google DeepMind最新發布的AlphaEvolve&#xff0c;探討其如何通過LLM與進化算法的結合&#xff0c;在數學難題突破、計算基礎設施優化等領域實現革命性進展。從48次乘法優化44矩陣相乘到數據中心資源利…

Java大師成長計劃之第24天:Spring生態與微服務架構之分布式配置與API網關

&#x1f4e2; 友情提示&#xff1a; 本文由銀河易創AI&#xff08;https://ai.eaigx.com&#xff09;平臺gpt-4-turbo模型輔助創作完成&#xff0c;旨在提供靈感參考與技術分享&#xff0c;文中關鍵數據、代碼與結論建議通過官方渠道驗證。 在微服務架構中&#xff0c;如何管理…

eSwitch manager 簡介

eSwitch manager 的定義和作用 eSwitch manager 通常指的是能夠配置和管理 eSwitch&#xff08;嵌入式交換機&#xff09;的實體或接口。在 NVIDIA/Mellanox 的網絡架構中&#xff0c;Physical Function&#xff08;PF&#xff09;在 switchdev 模式下充當 eSwitch manager&am…

最新開源 TEN VAD 與 Turn Detection 讓 Voice Agent 對話更擬人 | 社區來稿

關鍵詞&#xff1a;對話式 AI | 語音智能體 | Voice Agent | VAD | 輪次檢測 | 聲網 | TEN GPT-4o 所展示對話式 AI 的新高度&#xff0c;正一步步把我們在電影《Her》中看到的 AI 語音體驗變成現實。AI 的語音交互正在變得更豐富、更流暢、更易用&#xff0c;成為構建多模態智…

AI實踐用例---日程規劃(通用日程管理文件ICS)靈感踩坑日常

我是一位踐行獨立開發者之路的菜鳥開發者。 由于執行力較差,常常有很多想法但是很多時候沒有去踐行。 所以我有了讓大模型為我生成日程安排的想法,這確實可以,很簡單。只需要將你的想法告訴ai就行了。 例如: 發給AI的提示詞: 我想你幫我對,嗯,未來的一年做一個嗯,大…

大疆無人機??DRC 鏈路

在大疆上云API中&#xff0c;??DRC 鏈路??通常指 ??Device-Cloud Remote Control Link&#xff08;設備-云端遠程控制鏈路&#xff09;??&#xff0c;它是無人機&#xff08;或設備&#xff09;與云端服務之間建立的??實時控制與數據傳輸通道??&#xff0c;用于實現…