字符串最大跨距

总时间限制: 1000ms 内存限制: 65536kB

描述

有三个字符串S,S1,S2,其中,S长度不超过300,S1和S2的长度不超过10。想检测S1和S2是否同时在S中出现,且S1位于S2的左边,并在S中互不交叉(即,S1的右边界点在S2的左边界点的左侧)。计算满足上述条件的最大跨距(即,最大间隔距离:最右边的S2的起始点与最左边的S1的终止点之间的字符数目)。如果没有满足条件的S1,S2存在,则输出-1。

例如,S = “abcd123ab888efghij45ef67kl”, S1=”ab”, S2=”ef”,其中,S1在S中出现了2次,S2也在S中出现了2次,最大跨距为:18。

  • 输入
    三个串:S1, S2, S3,其间以逗号间隔(注意,S1, S2, S3中均不含逗号和空格);
  • 输出
    S1和S2在S最大跨距;若在S中没有满足条件的S1和S2,则输出-1。
  • 样例输入
    abcd123ab888efghij45ef67kl,ab,ef
  • 样例输出
    18

题解:

–这道看起来很简单的题,其实真的是小错误,大恶心(我都和它死磕到底了)
具体见注释,啦啦啦啦啦啦绿绿绿绿绿绿绿绿啦啦啦绿啦啦绿绿绿绿


代码:

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int MAXN=305;

int l,l1,l2;
char s[MAXN],s1[MAXN],s2[MAXN];
int a,b;  //分别是s1的右位置和s2的左位置

int main(){
    char A;
    A=getchar();
    while(A!=','){
        s[++l]=A;
        A=getchar();
    }
    A=getchar();
    while(A!=','){
        s1[++l1]=A;
        A=getchar();
    }
    A=getchar();
    while(A!=EOF){ //这里,我开始用的是 A!='/n' 然后莫名TML
        s2[++l2]=A;
        A=getchar();
    }
    int k=1;
    for(int i=1;i<=l;i++){
        if(s[i]==s1[k])
            k++;
        else
            k=1;
        if(k==l1+1){
            a=i;
            break;
        }
    }
    k=l2-1; //额,原来EOF也是算一个字符,然后被存在s2里面了....
    for(int i=l;i>=1;i--){
        if(s[i]==s2[k])
            k--;
        else
            k=l2-1;
        if(k==0){
            b=i;
            break;
        }
    }
    if(a>=b)
        cout<<-1<<endl;
    else
        cout<<b-a-1<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41709770/article/details/79574504