• 字符串最大跨距


    描述

    有三个字符串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<cstdio>
    #include<cstring>
    using namespace std;
    char s[305],s1[15],s2[15];
    int main()
    {
    char c;
    int len=0,len1=0,len2=0;
    while((c=getchar())&&c!=',')
    s[len++]=c;//输入字符数组s
    while((c=getchar())&&c!=',')
    s1[len1++]=c;//输入字符数组s1
    while((c=getchar())&&c!=0)
    s2[len2++]=c;//输入字符数组s2
    int i,j=len2-2,k=0,ans=0;
    for(i=0;i<len;i++)
    {
    if(s[i]==s1[k])
    k++;//当字符数组s1和字符数组s的字符相同时k++,当k==len1时进行if语句
    else
    {
    k=0;//否则k重置为0,继续寻找
    if(s[i]==s1[k]) k++;//找到的话进行if语句
    }
    if(k==len1)//如果找到了
    {
    ans=ans-(i+1);//如果k的长度等于s1的数组长度则把-(i+1)赋值给ans即为s1后第一个字符位置的负值{a s d a d a d s1(z)

    break;//跳出循环
    }
    }
    //cout<<len2<<" "<<s2[j]<<" ";
    for(i=len-1;i>=0;i--)
    {//从字符数组s的最后一个字符开始遍历
    if(s[i]==s2[j])
    { j--;}//从字符数组s2倒着的第一个有效的字符算起如果和字符数组s的字符相等的话则j--
    else
    {
    j=len2-2;//重置为l2-2
    if(s[i]==s2[j]) j--;
    }
    if(j==0)//当找到时
    {
    ans=ans+(i-1);//如果j==0,则把t+(i-1)赋值给t;
    break;
    }
    }
    if(ans>=0) cout<<ans;//如果t大于0则输出t
    else cout<<"-1";//否则输出-1
    return 0;
    }

  • 相关阅读:
    队列
    生物信息 perl 脚本实战
    Linux 命令速查
    perl 语法速查 | 模块安装
    Falcon Genome Assembly Tool Kit Manual
    Falcon:三代reads比对组装工具箱
    白话经典算法系列
    八大排序算法
    七大查找算法(附C语言代码实现)
    samtools常用命令详解(转)
  • 原文地址:https://www.cnblogs.com/741623027zzx/p/6515147.html
Copyright © 2020-2023  润新知