LeetCode76 最小覆蓋子串

2021-10-06 10:03:16 字數 1918 閱讀 9896

題目描述

給你乙個字串 s、乙個字串 t,請在字串 s 裡面找出:包含 t 所有字元的最小子串。

示例:

輸入: s = "adobecodebanc", t = "abc"

輸出: "banc"

說明:

如果 s 中不存這樣的子串,則返回空字串 ""。

如果 s 中存在這樣的子串,我們保證它是唯一的答案。

解題思路

子串問題,很容易就能聯想滑動視窗演算法。

滑動視窗的基本思想就是存在兩個指標left和right,兩個指標開始時都是位於0索引,首

先right不斷的向右移動,掃瞄長串s(注意:right移動過程中left保持不動),直到right所掃

描過的字串裡面都包含了子串t,這時right停止掃瞄,記錄下此刻的掃瞄過的字串

的首尾索引,然後這時就可以向右移動left指標,以此縮小字串的長度,當left指標剔

除的字元是t字串的字元時,為了保證掃瞄過的字串符合包含t字串的條件,left

指標就要停止移動,讓right指標又開始向右移動,直到再次將t符串包含,right指標和

left指標交替移動,在次過程中記錄下最小的長度,最後返回。

**

package test;

public

class

demo127

public string minwindow

(string s, string t)

// 滑動視窗字元頻數統計

int[

] winfre=

newint

[128];

// 子串字元頻數統計

int[

] tfre=

newint

[128];

// 統計子串字元的個數

for(

char c: ct)

int minlen=slen+1;

// 字串最小時的長度

int begin=0;

// 開始索引

int distance=0;

//·滑動視窗內部包含多少個t中的字元,對應的字元頻數超過不重複計算

int left=0;

int right=0;

while

(right// 如果掃瞄到的字元在t子串中,且出現次數還小於t串出現次數

// 這裡為什麼要強調次數的大小?因為如果s串中某個字元的出現次數大於等於t串的次數,再自增distance沒有意義

if(winfre[cs[right]

]< tfre[cs[right]])

winfre[cs[right]]++

; right++

;// 如果右邊全部涵蓋了t串出現的字元,就需要從左邊縮短子串的長度

while

(distance==tlen)

// 剔除的字元不是t串的字元,不會影響t串符合條件,直接不處理,跳下乙個

if(tfre[cs[left]]==

0)// 剔除的字元是t串的字元,影響了字串t,distance-1

if(winfre[cs[left]

]==tfre[cs[left]])

winfre[cs[left]]--

; left++;}

}// 最小字串長度未變,表示沒有符合條件的t串存在

if(minlen==slen+1)

return s.

substring

(begin, begin+minlen);}

}

標籤:雙指標、滑動視窗

LeetCode76 最小覆蓋子串

給定乙個字串 s 和乙個字串 t,請在 s 中找出包含 t 所有字母的最小子串。示例 輸入 s adobecodebanc t abc 輸出 banc 說明 字串和雜湊表的問題。hashmap來儲存t字串中個字母元素的出現次數,left right記錄當前子字串的左右下標值,min minleft ...

leetcode 76 最小覆蓋子串

這道題我使用了很笨的方式花了好久解決了,但是時間複雜度太度,只看網上檢視原始碼,不得不說網上的答案基本都是一樣的,但是對於基礎相對薄弱的我來說這些 看起來很是費勁,還用要加強c 基礎的練習才行。思路相對來說不是很難 1 首先構架t字串的hash表,因為字元與ascii碼較好的關係,使用vector陣...

leetcode76 最小覆蓋子串

給定乙個字串 s 和乙個字串 t,請在 s 中找出包含 t 所有字母的最小子串。示例 輸入 s adobecodebanc t abc 輸出 banc 說明 如果 s 中不存這樣的子串,則返回空字串 如果 s 中存在這樣的子串,我們保證它是唯一的答案。典型雙指標滑動串列埠題目,先將t建dict,然後...