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...