C++ 代码
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
string s, s1, s2;
char x;
int i = 0;
while(cin >> x)
{
if(x !=',')//用一个单独字符来判断输入是否结束
{
if(i == 0)
s += x;//用加法来将每个字符输入string字符串中
else if (i == 1)
s1 += x;
else
s2 += x;
}
if(x == ',')
i++;
}
int n1 = s.find(s1);
int n2 = s.rfind(s2);
if(n1 !=string::npos && n2 !=string::npos && n1 + s1.size() <= n2)
cout << n2 -(n1 + s1.size());
else
cout << -1;
return 0;
}
第二种手搓遍历写法
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
string s, s1, s2;
char x;
while(cin >> x , x!= ',') s += x;
while(cin >> x , x!= ',') s1 += x;
while(cin >> x ) s2 += x;
if(s.size() < s1.size() || s.size() < s2.size() || s.size() < s1.size() + s2.size())
puts("-1"); //边界情况直接 -1 结束
else
{
int l = 0; //定义s1的起始位置
while(l + s1.size() < s.size()) //遍历s 直到位置不够s1
{
int i = 0; //记录匹配成功的字符的个数
//定义在外边是为了下文便于验证 是否每一位都匹配成功了
while(i < s1.size())
{
if(s[l+i] != s1[i]) break;//某一位不匹配 即跳出匹配流程 由下文来判断是否完全匹配
i++;
}
if(i == s1.size()) // i为匹配成功的字符个数
break; //匹配成功则无需继续遍历了,即为第一次匹配成功的起始位置
l++; //没有成功,则从s字符串的下一位开始匹配
}
int r = s.size() - s2.size();//末尾向前,从第一个足够匹配s2的位置开始
while(r >= 0)// 向前遍历
{
int i = 0;//记录匹配成功的字符的个数
while(i < s2.size())
{
if(s[r+i] != s2[i]) break;
i++;
}
if(i == s2.size()) break;
r--;
}
if(l + s1.size() > r) puts("-1"); //s1的末尾在s2起始位右边
else
cout << r - (l + s1.size()) << endl; //l+s1.size() 的位置为左边字符串末尾的下一位 与所求结果相符
}
return 0;
}