题目描述
给你一个字符串 s
、一个字符串 t
。返回 s
中涵盖 t
所有字符的最小子串。如果 s
中不存在涵盖 t
所有字符的子串,则返回空字符串 ""
。
注意:
-
对于
t
中重复字符,我们寻找的子字符串中该字符数量必须不少于t
中该字符数量。 -
如果
s
中存在这样的子串,我们保证它是唯一的答案。
示例 1:
输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"
思路
代码
#include <iostream>
#include <unordered_map>
#include <string>
using namespace std;
class Solution {
public:
unordered_map <char, int> ori, cnt;
bool check() {
for (const auto& p : ori) {
if (cnt[p.first] < p.second) {
return false;
}
}
return true;
}
string minWindow(string s, string t) {
for (const auto& c : t) {
++ori[c];//记录需要元素的个数的哈希表
}
int l = 0, r = -1;//s[++r]
int len = INT_MAX, ansL = -1, ansR = -1;
while (r < int(s.size())) {
if (ori.find(s[++r]) != ori.end()) {
++cnt[s[r]];//用一个哈希表 动态 维护窗口中所有的字符以及它们的个数
}
while (check() && l <= r) {
if (r - l + 1 < len) {
len = r - l + 1;
ansL = l;
}
if (ori.find(s[l]) != ori.end()) {
--cnt[s[l]];
}
++l;
}
}
return ansL == -1 ? string() : s.substr(ansL, len);
}
};
int main() {
string s, t;
getline(cin, s);//s = "ADOBECODEBANC", t = "ABC"
getline(cin, t);
Solution a;
cout << a.minWindow(s, t);//BANC
}