For example,
S = “ADOBECODEBANC”
T = “ABC”
Minimum window is “BANC”.
Note:
If there is no such window in S that covers all characters in T, return the empty string “”.
If there are multiple such windows, you are guaranteed that there will always be only one unique minimum window in S.
class Solution {
public:
string minWindow(string s, string t) {
unordered_set<char> st;
unordered_map<char, list<size_t> > mp;
unordered_map<char, size_t> num;
unordered_map<char, size_t> check;
vector <size_t> next(s.size());
char nextfind;
size_t begin = 0;
size_t last = begin;
int flag = 0;
for (auto ch : t) {
++num[ch];
}
check = num;
string ret;
size_t minlen = s.size() + 1;
list<int> ls;
size_t i = 0;
for (; i <= s.size(); ++i) {
char ch = s[i];
if (num.end() != num.find(ch)) {
begin = i;
last = begin;
mp[ch].push_back(i);
if (check.end() != check.find(ch)) {
--check[ch];
}
if (check[ch] == 0)
check.erase(ch);
break;
}
}
if (t.size() == 1 && s[begin] == t[0])
return t;
for (++i; i <= s.size(); ++i) {
char ch = s[i];
if (num.end() != num.find(ch)){
next[last] = i;
last = i;
if (ch == s[begin] && num[ch] == mp[ch].size()) {
mp[ch].erase(mp[ch].begin());
mp[ch].push_back(i);
begin = next[begin];
while (mp[s[begin]].size() > num[s[begin]]) {
mp[s[begin]].erase(mp[s[begin]].begin());
begin = next[begin];
}
}
else {
mp[ch].push_back(i);
if (check.end() != check.find(ch)) {
--check[ch];
if (check[ch] == 0)
check.erase(ch);
}
if ((!flag && check.empty()) || (flag && s[i] == nextfind)) { // 找到了一个窗
flag = 1;
if (i - begin + 1 < minlen) {
minlen = i - begin + 1;
ret = string(s.begin() + begin, s.begin() + i + 1);
}
// 找下一个begin;
nextfind = s[begin];
mp[s[begin]].erase(mp[s[begin]].begin());
if (mp[s[begin]].size() == 0)
mp.erase(s[begin]);
begin = next[begin];
while (mp[s[begin]].size() > num[s[begin]]) {
mp[s[begin]].erase(mp[s[begin]].begin());
begin = next[begin];
}
}
}
}
}
return ret;
}
};
參考後
别人的代码不是一般的牛逼
class Solution {
public:
string minWindow(string s, string t) {
vector<int> map(128, 0);
size_t counter = t.size();
size_t head;
size_t begin = 0;
size_t len = s.size() + 1;
for (auto ch : t) {
++map[ch];
}
for (size_t i = 0; i != s.size(); ++i) {
char ch = s[i];
if (map[ch] > 0)
--counter;
--map[ch];
while (counter == 0) {
if (i - begin + 1 < len) {
len = i - begin + 1;
head = begin;
}
if (map[s[begin]] == 0) ++counter;
++map[s[begin]];
++begin;
}
}
if (len == s.size() + 1) return "";
return s.substr(head, len);
}
};