力扣 题目76- 最小覆盖子串
题目
题解
直接看代码吧
代码
1 #include<iostream> 2 #include<string> 3 #include<unordered_map> 4 using namespace std; 5 class Solution { 6 public: 7 string minWindow(string s, string t) { 8 unordered_map<char, int> hs, ht; 9 //记录频率 10 for (auto c : t) 11 { 12 ht[c]++; 13 } 14 string res; 15 for (int i = 0, j = 0, cnt = 0; i < s.size(); i++) { 16 hs[s[i]]++; 17 //判断当前字符是否为t的字符 如果是则满足了一次 cnt++; 18 if (hs[s[i]] <= ht[s[i]]) { 19 cnt++; 20 } 21 //找j满足hs[s[j]] <= ht[s[j]] 22 //因为分析肯定是s两边必为t的字符 23 //而这里的hs[s[j++]]--; 可以使得之后hs[s[j]] > ht[s[j]] 判断可以成功 即能够可以移动j(左)向右 24 while (j < s.size() && hs[s[j]] > ht[s[j]]) { 25 hs[s[j++]]--; 26 } 27 //cnt == t.size() 是否满足t中字符全有 28 //i - j + 1 < res.size() 是否比当前res还小 找最短 29 if (cnt == t.size() && (res == "" || i - j + 1 < res.size())) { 30 res = s.substr(j, i - j + 1); 31 } 32 } 33 return res; 34 } 35 }; 36 37 int main() { 38 Solution sol; 39 string s = "cabwefgewcwaefgcf"; 40 string t= "cae"; 41 string result=sol.minWindow(s,t); 42 cout << result << endl; 43 }