是 的子序列的意思是:从 中删去若干个字符,可以得到 ;特别的,如果 ,那么 也是 的子序列;空串是任何串的子序列。例如: 是 的子序列, 是 的子序列,但 不是 的子序列。
表示 共 个字符构成的字符串,若 则 是空串。 同理。
#include <iostream>#include <string>using namespace std;const int max1 = 202;string s, t;int pre[max1], suf[max1]; 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] + 1) ++j; ans = max(ans, j - i - 1); tmp = pre[i]; } cout << ans << endl; return 0;}提示:
- 是 的子序列;
- 是 的子序列。
(1分)程序输出时,suf 数组满足:对任意 。 ()
(2分)当 是 的子序列时,输出一定不为 。()
(2分)程序运行到第 行时, 一定不小于 。()
(2分)当 是 的子序列时,pre 数组和 suf 数组满足:对任意 。 ()
若 tlen=10,输出为 ,则 最小为()。
若 tlen=10,输出为 ,则 最小为()。