题目:
难度: hard
思路: O(n)复杂度下感觉要用哈希表,使用两个指针,指向进行的首尾,当发现有包含T字符串的序列时,移动首指针,缩小氛围,大体思路是这样,但是具体细节和代码实现写不出来-,-。 再读懂了其他解答的情况下实现了代码
AC解:
class Solution {
public:
string minWindow(string s, string t) {
//counter记录t字符串序列中还有多少个在end - start所指序列未包含的
int start = 0, end = 0, counter = t.length();
int minStart = 0, minLen = INT_MAX;
vector<int> m(128, 0);
//统计t中每个字符出现的次数
for (auto a : t) m[a]++;
int len = s.length();
while (end < len) {
//m[s[end]] > 0 说明是此字符还未包含在end - start序列中
if (m[s[end]] > 0)
counter--;
m[s[end]]--; //如果s[end]不是T字符串中的字符,或者个数多余了T中的个数,那么则是负数
end++;
//end - start序列完整包含了T中所有字符
while (counter == 0) {
if (end - start < minLen) {
minLen = end - start;
minStart = start;
}
/*下面是比较难理解的,因为要移动指针start,所以m[s[start]]++
把这个字符从end - start中移除,如果移除了m[s[start]] > 0 说明
这个字符是T中的字符,并且在start + 1 ~ end的序列中没有多余的,那么
就需要counter++来重新统计此字符。 m[s[start]] <= 0 则说明此字符在
start + 1 ~ end序列中有多余的,while循环继续缩小范围*/
m[s[start]]++;
if (m[s[start]] > 0)
counter++;
start++;
}
}
return minLen == INT_MAX ? "" : s.substr(minStart, minLen);
}
};