题目描述
778.字符串最大跨距
方法1(y总)
(暴力枚举)
C++ 代码
#include<iostream>
#include<cstring>
#include<cstdio>
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())
puts("-1");
else{
//枚举左侧(从左往右)
//枚举l这个起点
int l=0;
while(l+s1.size()<=s.size()){
int k=0;
//枚举从i开始的这一段是不是与s1相等
while(k<s1.size()){
if(s[l+k]!=s1[k])
break;//一旦有一个字符不相等,跳出
k++;
}
if(k==s1.size())
break;//当前起点i与s1匹配
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+=s1.size()-1;
if(l>=r)//s1、s2交叉
puts("-1");
else{
printf("%d\n",r-1-l);
}
}
return 0;
}
方法2
C++ 代码
#include <iostream>
using namespace std;
int main()
{
string s, s1, s2, a;
getline(cin, a);
int f1,f2;//两个','的位置
f1=a.find(',');
f2=a.rfind(',');
s=a.substr(0,f1);
s1=a.substr(f1+1,f2-f1-1);
s2=a.substr(f2+1);
int i=s.find(s1);//在s中顺序查找字符串s1,找到返回s1首字母在字符串中的下标,找不到返回-1
int j=s.rfind(s2);//在s中逆序查找s2,返回s2前一个字符在字符串的下标
if(i==-1||j==-1){
cout<<"-1"<<endl;
return 0;
}
int k=s.find(s1)+s1.size()-1;//k为s1最右面的下标
if (i>=j)//s1、s2交叉
cout<<"-1";
else if (k>= j)//s1、s2交叉
cout<<"-1";
else cout<<j-k- 1;
return 0;
}