这个算法不对,你现在是 j 一直后移,k 是在匹配到字符才后移,题目要求不是这样的
用这个思路写吧,虽然这个思路超时,但是至少正确这道题的思路是:
1) begin开始指向0, end一直后移,直到begin - end区间包含T中所有字符。
记录窗口长度d
2) 然后begin开始后移移除元素,直到移除的字符是T中的字符则停止,此时T中有一个字符没被
包含在窗口,
3) 继续后移end,直到T中的所有字符被包含在窗口,重新记录最小的窗口d。
4) 如此循环知道end到S中的最后一个字符。
for(size_t j = i; j < s.size() && k < t.size(); j++)
{
if(t[k] == s[j])
{
k++;
// max 赋值给 min ?
// 把最大的赋值给最小的?这是什么操作?
Min = max(Min, j); //表示以i开头,这一段至少需要的子串
Delete(s, j); //在这个循环中把s中已经使用过的j删除,避免无法判断重复元素
j = i - 1;
// 为什么要加这个 continue ?
// 这里的 continue 对程序没有任何影响
// 加不加都一样
//continue;
} //得到从i到Min的一串子串为需要的子串(但不一定是最小子串)
}
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
class Solution {
public:
//void Delete(string x,int n)
void Delete(string &x,int n)
{
size_t i;
for(i=n;i<x.size()-1;i++)
{
x[i]=x[i+1];
}
x[i-1]=' ';
}
string minWindow(string s, string t) {
size_t k = 0;
int p = -1, q = -1;
size_t Minresult = s.size();
size_t Min = -1;
string result, r, S = s;
#if 0
if(s.size()<t.size())
{
/*
result="";
return result;
*/
return "";
}
if(s == t)
{
return s;
}
#endif
if(s == t) return s;
if(s.size() < t.size()) return "";
for(size_t i = 0; i <= s.size() - t.size(); i++)
{
std::cout << "i: " << i << std::endl;
for(size_t j = i; j < s.size() && k < t.size(); j++)
{
std::cout << "k: " << k << ", " << "t[k]: " << "'" << t[k] << "'" << std::endl;
std::cout << "j: " << j << ", " << "s[j]: " << "'" << s[j] << "'" << std::endl;
std::cout << std::endl;
if(t[k] == s[j])
{
k++;
// max 赋值给 min ?
// 把最大的赋值给最小的?这是什么操作?
Min = max(Min, j); //表示以i开头,这一段至少需要的子串
Delete(s, j); //在这个循环中把s中已经使用过的j删除,避免无法判断重复元素
j = i - 1;
// 为什么要加这个 continue ?
// 这里的 continue 对程序没有任何影响
// 加不加都一样
//continue;
} //得到从i到Min的一串子串为需要的子串(但不一定是最小子串)
}
if(Minresult > Min - i && (Min - i + 1) >= t.size() && k == t.size())
{
Minresult = Min - i + 1;
p = Min;
q = i; //用p,q存储最小子串的首尾位置
}
Min = -1;
k = 0;
s = S; //还原s,开始下一次循环
}
//循环结束,返回以q开头,p结束的最小子串
if(p == -1 && q == -1) return "";
return string(&s[q], &s[p + 1]);
#if 0
if(p==-1&&q==-1)
{
result="";
}
else
{
/*
for(int h=q;h<=p;h++)
{
result.push_back(s[h]);
}
*/
result = string(&s[q], &s[p + 1]);
}
return result;
#endif
}
};
int main() {
std::cout << Solution().minWindow("bbaa", "aba") << std::endl;
return 0;
}
|