力扣 题目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 }
View Code

 

posted @ 2022-06-29 16:59  无聊的阿库娅  阅读(10)  评论(0编辑  收藏  举报