有三个字符串 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
#include
#include
using namespace std;
int main ()
{
string S;
cin>>S;
string s, s1, s2;
int n = 0;
int pos[2];
for(int i = 0; i < S.size(); i ++) {
if(S[i] == ',') {
pos[n] = i;
n ++;
}
}
s = S.substr(0, pos[0]);
s1 = S.substr(pos[0] + 1, pos[1] - pos[0] - 1);
s2 = S.substr(pos[1] + 1);
int res = -1;
int exit = 0;
int maxpos = 0;
for(int i = 0; i < s.size(); i ++) {
if(s.substr(i, s1.size()) == s1) {
// exit == 1;
int j = i + s1.size();
string rights = s.substr(j);
//cout<<"rights:"<
for(int t =0; t < rights.size(); t ++) {
if(rights.substr(t, s2.size()) == s2) {
//cout<
maxpos = t;
exit = 1;
}
}
break;
}
}
if(!exit)
cout<<"-1"<<endl;
else
cout<<maxpos<<endl;
return 0;
}
主要是模拟取子串,s1从前面去第一个,s2取去掉第一个s1的最后一个,返回位置即可。