假设我们有两个字符串S和T,我们必须找到S的最小子字符串W,以便T是W的子序列。如果S中没有覆盖T中所有字符的窗口,则返回空字符串。如果有多个这样的窗口,我们必须返回最左侧的起始索引的窗口。
因此,如果输入类似于S =“ abcdebdde”,T =“ bde”,则输出将为“ bcde”,因为它出现在“ bdde”之前。“ deb”不是一个较小的窗口,因为窗口中T的元素必须按顺序出现。
为了解决这个问题,我们将遵循以下步骤-
tidx:= 0,tlen:= T的大小
n:= S的大小
i:= 0,长度:= inf,开始:= -1
当我<n时,-
(将tidx增加1)
如果tidx与tlen相同,则-
长度:=结束-我
开始:=我
如果S [i]与T [tidx]相同,则-
(将i减1)
(将tidx减少1)
结束:= i + 1
(将tidx减少1)
当tidx> = 0时,执行-
(将i增加1)
(将tidx增加1)
如果结尾-i <长度,则-
如果S [i]与T [tidx]相同,则-
(将i增加1)
如果start不等于-1,则-
ret:= ret + S [i]
对于初始化i:=开始,当i <开始+长度,更新(将i增加1)时,执行-
返回ret
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string minWindow(string S, string T) {
int tidx = 0;
int tlen = T.size();
int n = S.size();
int i = 0;
int length = INT_MAX;
int start = -1;
string ret;
while (i < n) {
if (S[i] == T[tidx]) {
tidx++;
if (tidx == tlen) {
int end = i + 1;
tidx--;
while (tidx >= 0) {
if (S[i] == T[tidx]) {
tidx--;
}
i--;
}
i++;
tidx++;
if (end - i < length) {
length = end - i;
start = i;
}
}
}
i++;
}
if (start != -1)
for (int i = start; i < start + length; i++)
ret += S[i];
return ret;
}
};
main(){
Solution ob;
cout << (ob.minWindow("abcdebdde", "bde"));
}"abcdebdde", "bde"
输出结果
"bcde"