题意:输入n,m,再输入长度为n的字符串s和长度为m的字符串t,从字符串s里找出子序列p,要求spi和ti相同(最终达到子序列和t相同)。求
pi+1−pi的最大值。(上一个字符和下一个字符的最大间隔)
题解:要最大间隔,就去找上一个字符最先出现的位置,和后一个字符最后出现的位置,即得最大值,再在众多间隔值中取出最大值就行了。
ACcode:
ll n, m, ans; ll pos1[200100],pos2[200100];//数组太大建议放外面 int main() { memset(pos1, 0, sizeof(pos1)); memset(pos2, 0, sizeof(pos2));//没有循环可以省略 string a, b; cin >> n >> m; cin >> a >> b; for (ll i = 0,j=0; j < m&&i<n; i++) { if (a[i] == b[j]) { pos1[j] = i; j++; }//从前往后标记,最小值 } for (ll j= m-1,i=n-1; j >0&&i>0; i--) { if (a[i] == b[j]) { pos2[j] = i; j--; }//从后往前标记,最大值 } ans = -1; for (ll i = 0; i < m-1; i++) ans = max(ans, pos2[i+1] - pos1[i]);//按题目要求得最大值 cout << ans; return 0; }