leetcode題 76 最小覆蓋子串(困難)

2021-09-26 01:16:33 字數 1480 閱讀 4927

一、題目描述:76. 最小覆蓋子串(困難)

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

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

輸出: "banc"

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

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

二、解題思路

滑動視窗演算法的思路:

1、我們在字串 s 中使用雙指標中的左右指標技巧,初始化 left = right = 0,把索引閉區間 [left, right] 稱為乙個「視窗」。

2、我們先不斷地增加 right 指標擴大視窗 [left, right],直到視窗中的字串符合要求(包含了 t 中的所有字元)。

3、此時,我們停止增加 right,轉而不斷增加 left 指標縮小視窗 [left, right],直到視窗中的字串不再符合要求(不包含 t 中的所有字元了)。同時,每次增加 left,我們都要更新一輪結果。

4、重複第 2 和第 3 步,直到 right 到達字串 s 的盡頭。

這個思路其實也不難,第 2 步相當於在尋找乙個「可行解」,然後第 3 步在優化這個「可行解」,最終找到最優解。左右指標輪流前進,視窗大小增增減減,視窗不斷向右滑動。

三、**

class solution 

for(int i =0 ;i < t.size();i++)

int left = 0;

int right = 0;

while(leftright - left)

}while(right0)

right ++;

}// print(dp);

// cout<<"print_set"}

// cout<<"left="<= s.size() && !check(dp,sset))

break;

// cout<<"left="}

// cout<<"left="<& dp,map& sset,char &c)

bool check(map& dp,map& sset)

return true;

}void print(map& dp)

cout<**二(別人優秀的**)

在判斷是子串是否包含字串t的所有字母上使用乙個map陣列就解決了

class solution ;

for (auto c : t) ++count[c];

int len = 0, minlength = s.length();

string res;

for (int l = 0, r = 0; r < s.length(); ++r)

if (++count[s[l++]] > 0) --len;}}

return res;

}};

LeetCode刷題 76 最小覆蓋子串

給你乙個字串s 乙個字串t,請在字串s裡面找出 包含t所有字母的最小子串。示例 輸入 s adobecodebanc t abc 輸出 banc 說明 如果s中不存這樣的子串,則返回空字串 如果s中存在這樣的子串,我們保證它是唯一的答案。class solution 建立對映計數 maptemp n...

Leetcode刷題76 最小覆蓋子串

給你乙個字串 s 乙個字串 t 返回 s 中涵蓋 t 所有字元的最小子串。如果 s 中不存在涵蓋 t 所有字元的子串,則返回空字串 注意 如果 s 中存在這樣的子串,我們保證它是唯一的答案。示例 1 輸入 s adobecodebanc t abc 輸出 banc 示例 2 輸入 s a t a 輸...

Leetcode第76題 最小覆蓋子串

題目 給你乙個字串 s 乙個字串 t,請在字串 s 裡面找出 包含 t 所有字母的最小子串。示例 輸入 s adobecodebanc t abc 輸出 banc 說明 如果 s 中不存這樣的子串,則返回空字串 如果 s 中存在這樣的子串,我們保證它是唯一的答案。題解解題思路來自於參考文章。本題採用...