【题解】- 【AcWing】- 778.字符串最大跨距

778.字符串最大跨距

题目描述

有三个字符串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。

输入格式

输入共一行,包含三个字符串S,S1,S2,字符串之间用逗号隔开。

数据保证三个字符串中不含空格和逗号。

输出格式

输出一个整数,表示最大跨距。

如果没有满足条件的S1和S2存在,则输出-1.

输入样例:

abcd123ab888efghij45ef67kl,ab,ef

输出样例:

18
难度:困难
时/空限制:1s / 64MB
总通过数:51
总尝试数:134
来源:语法题
算法标签:字符串

AC代码

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int main(void)
{

    string S,S1,S2;
    int i, a, b;
    char arr[325];
    scanf("%s",&arr);
    for(i = 0; i < strlen(arr); i ++){
        if(arr[i] == ','){
            a = i;
            break;
        }
        S += arr[i];
    }//将第一个,之前的字符串输入字符串S
    for(i = a + 1; i < strlen(arr); i ++){
        if(arr[i] == ','){
            b = i;
            break;
        }
        S1 += arr[i];
    }//将两个,之间的字符串输入字符串S1
    for(i = b + 1; i < strlen(arr); i ++){
        S2 += arr[i];
    }//将第二个,之后的字符串输入字符串S2
    int s,s1,s2;
    s1=S.find(S1);
    s2=S.rfind(S2);
    if((s1+S1.length()-1)<s2){
        cout<<s2-s1-S1.length()<<endl;
    }//输出跨距
    else cout<<"-1"<<endl;
}

思考,总结

关键在于C++中string中的find和rfind的应用

该题中S.find(S1)的意义是返回S字符串中首次出现S1的位置,这个位置是S1第一个字符的位置。

扫描二维码关注公众号,回复: 8885159 查看本文章

​ S.rfind(S2)的意义是返回S字符串中从后向前首次出现S2的位置,这个位置是S2第一个字符的位置。

发布了34 篇原创文章 · 获赞 2 · 访问量 883

猜你喜欢

转载自blog.csdn.net/Kapo1/article/details/104028725