若 tlen=10 且输出为2,则 slen 必须至少包含 t 的所有字符,并且至少有两个字符不包含在 t 中,因此 slen 最小为 10。
本题t是s的子序列的意思是:从s中删去若干个字符,可以得到t特别的,如果 s=t,那么t也是s的子序列:空串是任何串的子序列。例如“acd”是“abcde”的子序列,“acd”是“acd”的子字列 但“adc”不是“abcde”的子序列。s[x..y]表示 s[x]...s[y]共 y-x+1 个字符构成的字符串 若 x>y 则 s[x...y]是空串。t[x..y]同理。
#include <iostream>
#include <string>
using namespace std;
const int maxl = 202;
string s, t;
int pre[maxl], suf[maxl];
int main() {
cin >> s >> t;
int slen = s.length(), tlen = t.length();
for (int i = 0, j = 0; i < slen; ++i) {
if (j < tlen && s[i] == t[j]) ++j;
pre[i] = j; // t[0..j-1]是s[0..i]的子序列
}
for (int i = slen - 1, j = tlen - 1; i >= 0; --i) {
if (j >= 0 && s[i] == t[j]) --j;
suf[i] = j; // t[j+1..tlen-1]是s[i..slen-1]的子序列
}
suf[slen] = tlen - 1;
int ans = 0;
for(int i=0, j=0, tmp=0; i<slen;++i){
while ( j <= slen && tmp>= suf[j] + i ) ++j;
ans=max(ans, j-i);
tmp = pre[i];
}
cout << ans << endl;
return 0;
}
0
10
12
1