有三个字符串 S,S1,S2S,S1,S2,其中,SS 长度不超过 300300,S1S1 和 S2S2 的长度不超过 1010。
现在,我们想要检测 S1S1 和 S2S2 是否同时在 SS 中出现,且 S1S1 位于 S2S2 的左边,并在 SS 中互不交叉(即,S1S1 的右边界点在 S2S2 的左边界点的左侧)。
计算满足上述条件的最大跨距(即,最大间隔距离:最右边的 S2S2 的起始点与最左边的 S1S1 的终止点之间的字符数目)。
如果没有满足条件的 S1S1,S2S2 存在,则输出 −1−1。
例如,S=S= abcd123ab888efghij45ef67kl
, S1=S1= ab
, S2=S2= ef
,其中,S1S1 在 SS 中出现了 22 次,S2S2 也在 SS 中出现了 22 次,最大跨距为:1818。
输入格式
输入共一行,包含三个字符串 S,S1,S2S,S1,S2,字符串之间用逗号隔开。
数据保证三个字符串中不含空格和逗号。
输出格式
输出一个整数,表示最大跨距。
如果没有满足条件的 S1S1 和 S2S2 存在,则输出 −1−1。
#include<iostream>
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;
int l=0;
if(s1.size()>s.size()||s2.size()>s.size())
{cout<<"-1";return 0;}
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();
while(r>=0)
{
int k=0;
while(k<s2.size())
{
if(s[r+k]!=s2[k])
break;
k++;
}
if(k==s2.size())
break;
r--;
}
l=l+s1.size()-1;//此时l是s1最后一个字符
if(r-l<=0)cout<<"-1";//如果r-l=0,则s1的最后一个字符与s2的第一个字符重叠,不满足s2位于s1的右边,与题意不符
else cout<<r-l-1;//r-l-1可看成是(r-1)-l,即s2第一个字符的左边第一个字符,此时相减则是s1 s2相差的字符数
}