暴力做法,简单易懂
有个边界忘了加导致废了将近一小时才弄出来,好烦,准备去看看y
总的讲解,看看他是怎么想的0.0
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s1, s2, s;
getline(cin, s, ',');
getline(cin, s1, ',');
getline(cin, s2);
//s1和s2同时在s中出现,计算s1和s2的最大间隔距离(最右边的S2的起始点与最左边的S1的终止点之间的字符数目)
if (s1.size() + s2.size() > s.size()) cout << "-1" << endl;
else
{
int left = 0, right = 0; //记录s1第一次出现的终止点和s2最后一次出现的起始点
int flag1 = 0, flag2 = 0; //先判断s1和s2是否同时在s中出现
for (int i = 0; i + s1.size() <= s.size(); i++) //判断s1是否是s的子串
{
int j = 0;
while (s1[j] == s[i + j] && j < s1.size()) j++;
if (j == s1.size())
{
left = i + j - 1;
flag1 = 1;
break; //s1是从左到右开始匹配的,因此找到第一个s1就直接记录它的终止点作为左端点
}
}
//cout << left << endl;
for (int i = s.size() - 1; i - s2.size() + 1 >= 0; i--) //判断s2是否是s的子串
{
int k = 0, j = i - s2.size() + 1; //j表示此次匹配在s中的开始下标
while (s2[k] == s[j + k] && k < s2.size())
{
//cout << s2[k] << s[j + k] << endl;
k++;
}
if (k == s2.size())
{
right = j;
flag2 = 1;
break; //s2是从右往左开始找第一个合适的,因此找到第一个s2就直接记录它的起始点作为右端点
}
}
//cout << right << endl;
if (flag1 && flag2 && right >=left) cout << right - left - 1 << endl;
else cout << "-1" << endl;
}
return 0;
}