演算法Day06 演算法研習指導之滑動視窗

2021-10-09 01:56:07 字數 3127 閱讀 8242

map[key] :

for

(int i =

0; i < s.size(

); i++)

:for

(int j = i +

1; j < s.size(

); j++)

:if s[i : j] 包含 t 的所有字母:

更新結果

滑動視窗演算法偽碼框架:

string s, t;

int left =

0, right =0;

// res是符合要求的最小覆蓋子串

string res = s

/* * 在s中尋找t的最小覆蓋子串

*/while

(right < s.

size()

)}return res;

如果window包含所有needs中的鍵,並且這些鍵對應的值都大於等於needs中的值,那麼當前視窗就符合要求,就可以開始移動left指標

滑動視窗演算法框架優化:

string s, t;

int left =

0, right =

0string res = s;

/* * 建立兩個hash表作為字元的計數器

*/ unordered_map<

char

,int

> window;

unordered_map<

char

,int

> needs;

for(char c : t) needs[c]++;

// 記錄window中符合要求的字元的個數

int match =0;

/* * 在s中尋找t的最小覆蓋子串

*/while

(right < s.

size()

)}right++

;// window中的字串是符合要求的最小覆蓋子串

while

(match == needs.

size()

)}left++}}

return res;

string minwindow

(string s, string t)

} right++

;while

(match == s.

size()

)char l = s[left];if

(needs.

count

(l))

} left++;}

}return minlen == init_max ?

"": s.

substr

(start, minlen)

;}

vector<

int>

findanagrams

(string s, string t)

} right++

;while

(match == s.

size()

)char l = s[left];if

(needs.

count

(left))}

left++}}

return res;

}

int

lengthoflongestsubstring

(string s)

// 每次移動right時,更新res值

res =

max(res, right - left);}

return res;

}

int left =

0, right =0;

while

(righ < s.

size()

)}

最小覆蓋子串完整**:

def

minwindow

(self, s :

str, t :

str)

->

str:

# 字串開始位置和長度

start, min_len =0,

float

('inf'

) left, right =0,

0 res = s

# 兩個計數器

needs = counter(t)

# defaultdict在訪問的key不存在的時候會返回預設值0

window = collections.defaultdict(

int)

# 記錄匹配要求的字元的個數

match =

0while right <

len(s)

: r = s[right]

if needs[r]

>1:

window[r]+=1

if window[r]

== needs[r]

: match +=

1 right +=

1while match =

len(needs)

:if right - left < min_len:

start = left

min_len = right - left

l = s[left]

if needs[l]

>0:

window[l]-=1

if window[l]

< needs[l]

: match -=

1 left -=

1return s[start : start + min_len]

if min_len !=

float

("inf"

)else

""

演算法Day07 演算法研習指導之雙指標

左右指標 左右指標 如果鍊錶中不包含環,那麼這個指標最終會遇到空指標null.表示這個鍊錶已經到頭了,表示這個鍊錶不包含環 boolean hascycle listnode head return false boolean hacycle listnode head return false l...

演算法Day02 演算法研習指導之動態規劃演算法框架

湊零錢問題總結 動態規劃的應用場景 動態規劃的核心問題 動態規劃的窮舉很特殊 具備最優子結構 這樣才能通過子問題的最值找到原問題的最值 列出正確的狀態轉移方程才能正確地窮舉 因為窮舉出所有可行解並不是一件容易的事 動態規劃三要素 狀態轉移方程思維框架 int fib int n return fib...

python 資料結構與演算法 day06 二分查詢

又稱折半查詢,把要查詢的元素跟序列中中間位置的元素進行比較,如果比中間位置元素小,就從序列的左半部分查詢,反之,從序列的右半部分查詢,對折半後的序列再按照類似比較中間元素折半的方法查詢 二分查詢要求序列是支援索引的,所以也就是作用物件是順序表,然後要求原始的序列必須是有序的 def binary s...