解题思路:好,还是想不出来。依然是跟着y总敲了一遍!
首先,从输入中读取三个字符串s、s1和s2。如果s的长度小于s1或者s2的长度,则直接输出-1,表示无解。
否则,从头开始遍历字符串s,逐个字符与s1进行比较。如果发现有不相同的字符,则将遍历位置向后移动一个字符,比较。一直遍历到找到一个与s1相等的子串或者遍历到s的末尾。从字符串s的末尾开始倒着遍历,逐个字符与s2进行比较。如果发现有不相同的字符,则将遍历位置向前移动一个字符,继续比较。一直遍历到找到一个与s2相等的子串。最后,根据找到的s1和s2的匹配位置,计算出s1和s2之间的最小距离。如果s1和s2交叉(即s1在s2的右侧),则输出-1表示无解。否则,输出r-l-1,表示s1和s2之间的距离。
#include<iostream>
using namespace std;
int main()
{
string s,s1,s2;
char c;//定义字符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{
int l=0;//从头开始遍历s
while(l+s1.size()<=s.size())//防止长度超过
{
int k=0;//定义k并初始化为0
while(k<s1.size())//k的长度不能超过s1
{
if(s[l+k]!=s1[k])break;//若发现有不相同的字符
else k++;//否则继续加一
}
if(k==s1.size())break;//一直将s1长度循环完了都相等右侧
else l++;//否则将s向后一个字符开始检查
}
int r=s.size()-s2.size();//倒着往前枚举!
while(r>=0)//保证r大于等于0
{
int k=0;
while(k<s2.size())//保证k的长度不超过s2
{
if(s[r+k]!=s2[k])break;//若发现有不同,则跳出此次循环
else k++;//若相同,继续检查
}
if(k==s2.size())break;//若相同,则跳出循环
else r--;//负责往前枚举
}
l+=s1.size()-1;//让l移动到s1的尾部
if(l>=r)puts("-1");//交叉的情况
else cout<<r-l-1<<endl;;
}
return 0;
}