1、t[256] 记录 target字符串每个字符出现的次数;
2、int start, i;
i首先遍历source,遍历到从 start 到 i 的子串包含 target ;是否包含根据两个数组间的值来判断找到的字符数量,来判断是否包含。
然后从start开始遍历,去除无用的字符。
用变量begin、end保存当前start 到 i的字符串。
start后移一位,此时一定不满足包含条件,再后移 i 找到新的符合条件的字符串。
参考:https://blog.csdn.net/u012156116/article/details/80648698
class Solution {
public:
/**
* @param source : A string
* @param target: A string
* @return: A string denote the minimum window, return "" if there is no such a string
*/
string minWindow(string &source , string &target) {
// write your code here
int *t = new int[256]();
for(int i = 0;i < target.length();i++){
t[target[i]]++;
}
int *s = new int[256]();
int found = 0; //找到的字符数量
int start = 0;
int begin = 1,end = 0;
int len = source.length()+1;
for(int i = 0;i < source.length();i++){
s[source[i]]++;
if(s[source[i]] <= t[source[i]]) //target中没有的为0,存在的话,source取到一次就加1。
{
found++;
}
if(found == target.length()){
while(start < i && s[source[start]] > t[source[start]]){
s[source[start]]--;
start++;
} //去除前面多余的字符
if(i-start+1 < len){
begin = start;
end = i;
len = i - start + 1;
}
start++; //将start后移 寻找其他子串
found--; //后移后 肯定不再满足条件
}
}
if(begin > end){
return ""; //对应一个子串也没找到的情况
}
string res = source.substr(begin,end-begin+1);
return res;
}
};
网友评论