有的答案正确,有的答案超时,但是答案都不对,不超时的那个 我是借鉴了一下输入样例,样例中有两个ef,答案应该是第二个ef和ab的跨距,而我的代码的答案是第一个ef与ab的跨距,不知道哪里不对,我单独输出了一下t1和t2,t1总是对的,t2都不对,而且单纯输出t2还有可能超时,所以应该是包含t2循环的错误,但是我找不出来,不要新写的代码,想知道错误在哪,有没有会debug的,可以弄一下,我不会
#include <iostream>
#include <cstdio>
#include <cstring>
#include <sstream>
using namespace std;
int main(){
string s,s1,s2,s3;
int x;
cin >> s;
int z=s.size();
for(int i=0;i<z;i++){
if(s[i]==',') break;
s1=s1+s[i];
x=i;
}
for(int i=x+2;i<z;i++){
if(s[i]==',') break;
s2=s2+s[i];
x=i;
}
for(int i=x+2;i<z;i++){
s3=s3+s[i]; //上面三个for循环的作用是把三个字符串分别提出来,已经测试过没有问题
}
int z1=s1.size(),z2=s2.size(),z3=s3.size();
int t1=0,flag1=0;
for(int i=0,j=0,count=0;i<z1;i++,j++){
if(s1[i]==s2[j%z2]){
count++;
}
if(count==z2){
flag1=1;
t1=i; //这个for循环的作用是找出s1在s中的第一个位置并将其最后一个字母在s中的坐标赋给t1
break;
}
if (s1[i]!=s2[j]){
i=i-count;
count=0;
j=j-count-1;
}
}
int t2=0,flag2=0;
for(int i=0,j=0,count=0;i<z1;i++,j++){
if(s1[i]==s3[j%z3])
count++;
if(count==z3){
flag2=1;
t2=i-count+1;
i=i-count+1;
j=-1;
} //这个for循环的作用是找出s2在s中的最后一个位置并将其最后一个位置的首字母在s中的坐标赋给t2
if(s1[i]!=s3[j]){ //因为要找最后一个s2在s中出现的位置,所以即使找到了相匹配的字符,我还是把坐标减到匹配之前的位置上
i=i-count; //然后结尾的时候i会自增1,所以相当于从匹配的字符的首字母的坐标的下一个坐标继续开始匹配,直到达到z1
count=0;
j=j-count-1;
}
}
int length=t2-t1-1;
if(flag1==0 || flag2==0 || length<0)
cout << "-1";
else
cout << length;
}