CF1203 兼第五次训练赛(D,E)

CF 1203 Remove the Substring (easy/hard version)
题意:
给两个字符串,第二个是第一个的字串,但是注意,在第一个字符串中一定包含至少一个该子串,但该子串在第一个字符串中不一定连续,求删除最长的连续字符且能使删除后依旧包含该子串的字符个数。
思路:
拿两个字符串将最先遇到的一个子字串每个位置记录,再用另一个将最后遇到的该子字符串每个位置记录下来,先比较其左右长短,再比较其中间的长短,具体实现看代码,此处借用刘大佬代码(太懒了,不想自己写了)

#include<stdio.h>
#include<string.h>
int wa[200001],wb[200001];
char a[200001],b[200001];
int main()
{
    int la,lb,i,j,mz,my,m;
    gets(a);
    gets(b);
    la=strlen(a);
    lb=strlen(b);
    for(i=0,j=0;j<lb;i++)//将最先出现的子字符串各位置输入数组
        if(a[i]==b[j])
        {
            wa[j]=i;
            j+=1;
        }
    i=la-1;
    j=lb-1;
    for(;j>=0;i--)//将最后出现的子字符串给位置输入数组
        if(a[i]==b[j])
        {
            wb[j]=i;
            j-=1;
        }
    if(wa[0]>=(la-1-wa[lb-1]))//判断删除左右两端连续字符数量
        mz=wa[0];
    else
        mz=la-1-wa[lb-1];
    if(wb[0]>=(la-1-wb[lb-1]))
        my=wb[0];
    else
        my=la-1-wb[lb-1];
    if(mz>my)
        m=mz;
    else
        m=my;//找出只从左右两端分别删除的最大数量
    for(i=1;i<lb;i++)//找出最先出现的第i个字符与最后出现的第i-1个字符组成一个新的子串后所删除字符数量若大于m则更新m
        if((wb[i]-wa[i-1]-1)>m)
            m=wb[i]-1-wa[i-1];
    printf("%d\n",m);
    return 0;
}

Cu1
发布了30 篇原创文章 · 获赞 2 · 访问量 972

猜你喜欢

转载自blog.csdn.net/CUCUC1/article/details/104432764