AcWing 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

分析 可以用find函数  也可以自己手写

找最左边的s1的起始位置,找最右边的s2的起始位置

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
    string s,s1,s2;
    char c;
    while(cin>>c&&c!=',')   s+=c;
     while(cin>>c&&c!=',')   s1+=c;
      while(cin>>c)   s2+=c;
      if(s.size()<s1.size()||s.size()<s2.size())   cout<<"-1";    //s1或者s2长度大于s时不符合
      int l=0;         //找最左边字符串的起始位置  也可用find函数
      while(l+s1.size()<s.size())
      {
          int k=0;
          while(k<s1.size())
          {
              if(s[l+k]!=s1[k]) break;
              k++;
            
          }
            if(k==s1.size())   break;
            l++;
      }
      int r=s.size()-s2.size();    //找最右边字符串的起始位置  也可用find函数
      
       while(r>=0)
      {
          int k=0;
          while(k<s2.size())
          {
              if(s[r+k]!=s2[k]) break;
              k++;
            
          }
            if(k==s2.size())   break;
            r--;
      }
      if(l+s1.size()-1>=r)  cout<<"-1";  //判断左边的终末位置是否大于等于右边的起始位置    如果大于证明重合 输出-1;
      else
      cout<<r-l-s1.size();
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值