D2. Remove the Substring (hard version)

D2. Remove the Substring (hard version)

给字符串s,t,保证t为s的子序列,求s删掉最长多长的子串,满足t仍为s的子序列

记录t中每个字母在s中出现的最右的位置,

然后从s开头开始跑

遇到和当前t[j]相同的s[i],j++

即使得t中相邻两个字符距离最大化

注意j跑完t了,最后一位应该为s的长度

#include<bits/stdc++.h>
using namespace std;
char s[200004];
char t[200004];
int R[200004];
int main()
{
    scanf("%s",s);
    scanf("%s",t);
    int m=strlen(t);
    int n=strlen(s);
    int j=m-1;
    int i=n-1;
    R[m]=n;
    while(s[i]!=t[j])
    {
        i--;
    }
    R[j--]=i;

    while(j>=0)
    {
        i--;
        while(s[i]!=t[j])i--;
        R[j]=i;
        j--;
    }
    j=0;
    int ans=0;
    //for(int i=0;i<=m;i++)cout<<R[i]<<' ';
    for(int i=0;i<n;i++){
               // if(j==m)break;
        ans=max(ans,R[j]-i);
        //cout<<R[j]<<i<<endl;
        if(j<m&&s[i]==t[j])j++;

    }
    cout<<ans<<'\n';

}

 

posted @ 2019-08-14 22:35  liulex  阅读(266)  评论(0编辑  收藏  举报