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