🌵🌵🌵前言
题目
有三个字符串 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 <iostream>
#include <algorithm>
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<<s3<<endl;
// cout<<s1<<endl; cout<<s2<<endl; cout<<s3<<endl;
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 "<<i<<endl;
int j=0;
for(;j<s2_len;j++){
if(s2[j]!=s3[i+j]){
// cout<<"break "<<i+j<<" "<<j<<" "<<s2[j]<<" "<<s3[i+j]<<endl;
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;
}