1. 题目来源
链接:76. 最小覆盖子串
2. 题目解析
前导题:
在这一开始写了个 cnt == ht.size()
,又进一步加深了 unordered_map
的理解。不论对其赋不赋值,均会进行插入操作!!一定牢记这点。
思路还是很常规的,套用了第三题的双指针思想,及第 30 题的一小部分快速判断区间字符是否覆盖的思想。蛮重要的两个思想。
代码:
class Solution {
public:
string minWindow(string s, string t) {
unordered_map<char, int> hs, ht;
for (auto e : t) ht[e] ++ ;
string res;
int cnt = 0;
for (int i = 0, j = 0; i < s.size(); i ++ ) {
hs[s[i]] ++ ;// 先加入哈希表中,若加入后该字符小于等于有效字符的个数则说明该操作有效
if (hs[s[i]] <= ht[s[i]]) cnt ++ ; // 等号不能丢...一开始想错了
while (hs[s[j]] > ht[s[j]]) hs[s[j ++ ]] -- ;
if (cnt == t.size()) {
if (i - j + 1 < res.size() || res.empty())
res = s.substr(j, i - j + 1);
}
}
return res;
}
};