C ++中的最小窗口子序列
假设我们有两个字符串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"