Minimum Window Substring
Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).
For example,
S = “ADOBECODEBANC”
T = “ABC”
Minimum window is “BANC”.
题目的要求是寻找最小覆盖子串,如果找不到返回”“。在解题过程中,我们可以利用hash的思想,用thash[T[i]]来存储,字符串T中各个单词出现的次数。
class Solution {
public:
string minWindow(string s, string t) {
vector<int> shash(128,0);
vector<int> thash(128,0);
for(int i=0;i<t.size();i++){
thash[t[i]]++;
}
int beg=-1,end=s.size(),start=0,found=0;
int min_len=s.size();
for(int i=0;i<s.size();i++){
shash[s[i]]++;
if(shash[s[i]]<=thash[s[i]]){//通过found来判断是否找到了所有t中的单词
found++;
}
if(found==t.size()){
while(start<i&&shash[s[start]]>thash[s[start]]){ //过滤掉字符串s中不属于t的字符
shash[s[start]]--; //或者属于t中的字符,但不是坐标最大的那个,如bba,ba取第二个b
start++;
}
if(i-start+1<=min_len){
beg=start;
end=i;
min_len=i-start+1;
}
shash[s[start]]--;
start++;
found--;
}
}
if(beg==-1)
return "";
else
return s.substr(beg,end-beg+1);
}
};
本文介绍了一种在字符串S中寻找包含字符串T所有字符的最小子串的方法,并提供了一个复杂度为O(n)的C++实现。通过使用hash表记录T中字符的出现次数,算法能在遍历S的过程中高效地找到满足条件的最小子串。
379

被折叠的 条评论
为什么被折叠?



