D2. Remove the Substring (hard version)

思路:其实就是贪心吧,先从前往后找,找到 t 可在 s 中存在的最小位置 (pre),再从后往前找,找到 t 可在 s 中存在的最大位置(last),然后 last [ i+1 ] - pre [ i ] - 1 表示的即是 t 中两个相邻字符可以删去的最大连续字串长度,当然也不要忘记第一个字符前面删去( last [ 0 ] )的和最后末尾删去的字符串(slen - pre [ tlen - 1 ] - 1)

代码:

// Created by CAD on 2019/8/14.
#include <bits/stdc++.h>
using namespace std;
using ll=long long;

string s,t;
const int maxn=2e5+5;
int pre[maxn],last[maxn];
int main()
{
    cin>>s>>t;
    int flag=0,slen=s.length(),tlen=t.length();
    for(int i=0;flag<tlen;++i)
        if(s[i]==t[flag])
            pre[flag++]=i;
    flag=tlen-1;
    for(int i=slen-1;flag>=0;i--)
        if(s[i]==t[flag])
            last[flag--]=i;
    int ans=max(last[0],slen-pre[tlen-1]-1);
    for(int i=0;i+1<tlen;++i)
        ans=max(ans,last[i+1]-pre[i]-1);
    cout<<ans<<endl;
}