一、題目描述: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 中存在這樣的子串,我們保證它是唯一的答案。題解解題思路來自於參考文章。本題採用...