• 字符串最大跨距


    🌵🌵🌵前言

    ✨你好啊,我是“ 怪& ”,是一名在校大学生哦。
    🌍主页链接:怪&的个人博客主页
    ☀️博文主更方向为:课程学习知识、作业题解、期末备考。随着专业的深入会越来越广哦…一起期待。
    ❤️一个“不想让我曾没有做好的也成为你的遗憾”的博主。
    💪很高兴与你相遇,一起加油!

    题目

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

    代码

    #include 
    #include 
    using namespace std;
    string s,s1,s2,s3;
    int flag[2];
    int num=0;
    
    int main(){
        cin>>s;
        int s_len=s.length();
        for(int i=0;i<s_len;i++){   //记录“,”的位置
            if(s[i]==',') {
                flag[num]=i;
                num++;
            }
        }
        
        s1=s.substr(flag[0]+1,flag[1]-flag[0]-1);//取出s1 
        s2=s.substr(flag[1]+1,s_len-flag[1]);   //取出s2
        s3=s.substr(0,flag[0]);                 //取出s3
        // 也可以:char c;while(cin>>c,c!=',') s+=c;输入
        // cout<
        // cout<
        int s1_len=s1.length(),s2_len=s2.length(),s3_len=s3.length();
        int left=0,right=0,left_flag=0,right_flag=0;
        
        for(int i=0;i<s3_len;i++){
            int j=0;
            for(;j<s1_len;j++){
                if(s1[j]!=s3[i+j]) break;
            }
            if(j==s1_len){  //找出最左边的s1,left即为最左边s1右边界的下一个位置
                left_flag=1;
                left=i+s1_len;
                break;
            }
        }
        
        for(int i=s3_len-s2_len;i>=0;i--){
            // cout<<"i "<
            int j=0;
            for(;j<s2_len;j++){
                if(s2[j]!=s3[i+j]){
                    // cout<<"break "<
                    break;
                } 
                
            }
            if(j==s2_len){
                right_flag=1;//找出最右边的s2,left即为最右边的s2的左边界
                right=i;
                break;
            }
        }
        
        if(left_flag==1 && right_flag==1) {//如果两者存在
            if(right-left>=0) cout<<right-left<<endl;//满足不交叉
            else cout<<-1<<endl;
        }
        else cout<<-1<<endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    ❤️❤️❤️忙碌的敲代码也不要忘了浪漫鸭!

  • 相关阅读:
    一文速学-最小二乘法曲线拟合算法详解+项目代码
    指静脉代码学习---1:滤波与去噪
    计算机组成原理平时作业四
    【点云数据集介绍】
    Python一步到位实现图像转PDF自动化处理详解
    Android 12.0 frameworks添加自定义服务
    不爱生活的段子手不是好设计师|ONES 人物
    NestJs系列之使用Vite搭建项目
    使用Python进行时间序列分析的8种图
    HTML+CSS+JS制作一个迅雷看看电影网页设计实例 ,排版整洁,内容丰富,主题鲜明,简单的网页制作期末作业
  • 原文地址:https://blog.csdn.net/qq_21471309/article/details/126328710