文章目录
- Question
- Ideas
- Code
Question
有三个字符串 S,S1,S2,其中,S 长度不超过 300,S1 和 S2 的长度不超过 10。
现在,我们想要检测 S1 和 S2 是否同时在 S 中出现,且 S1 位于 S2 的左边,并在 S 中互不交叉(即,S1 的右边界点在 S2 的左边界点的左侧)。
计算满足上述条件的最大跨距(即,最大间隔距离:最右边的 S2 的起始点与最左边的 S1 的终止点之间的字符数目)。
如果没有满足条件的 S1,S2 存在,则输出 −1。
例如,S= abcd123ab888efghij45ef67kl, S1= ab, S2= ef,其中,S1 在 S 中出现了 2 次,S2 也在 S 中出现了 2 次,最大跨距为:18。
输入格式
输入共一行,包含三个字符串 S,S1,S2,字符串之间用逗号隔开。
数据保证三个字符串中不含空格和逗号。
输出格式
输出一个整数,表示最大跨距。
如果没有满足条件的 S1 和 S2 存在,则输出 −1。
输入样例:
abcd123ab888efghij45ef67kl,ab,ef
输出样例:
18
Ideas
- 查找两个字串(s1、s2)的位置
- 判断s1、s2位置是否有交集
- 输出s1、s2之间的位置差
Code
#include <iostream>
#include <string>
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;
// s不包括s1和s2
if (s1.size() > s.size() || s2.size() > s.size())
cout << -1 << endl;
else
{
// 确定s1、s2的位置,均从起点开始
int l = 0;
for (; l + s1.size() <= s.size(); l++)
{
int k = 0;
for (; k < s1.size(); k++)
{
if (s1[k] != s[l+k]) break;
}
if (k == s1.size()) break;
}
int r = s.size() - s2.size();
for (; r; r--)
{
int k = 0;
for (; k < s2.size(); k++)
{
if (s2[k] != s[r+k]) break;
}
if (k == s2.size()) break;
}
l = l + s1.size() - 1;
if (l >= r) puts("-1");
else printf("%d\n", r-l-1);
}
return 0;
}