一开始用的char字符数组,然后发现后面找子串的时候太麻烦了,然后又改成了string。
主要的思想就是先把这一行输入的三个字符串分开,然后一个从前往后找,一个从后往前找。
find()直接找到的都是第一个子串的位置。
从后往前我用的是substr(),从后往前一个个找的。
注意边界条件,s1右边界和s2左边界的问题(不知道这个有没有测试点,但还是注意一下吧)。
代码我写的还是比较短的,应该不难懂。
描述
有三个字符串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。
输入
三个串:S1, S2, S3,其间以逗号间隔(注意,S1, S2, S3中均不含逗号和空格);
输出
S1和S2在S最大跨距;若在S中没有满足条件的S1和S2,则输出-1。
样例输入
abcd123ab888efghij45ef67kl,ab,ef
样例输出
18
代码段
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
string s1, s2;
cin >> str;
//开始把这三个字符串分开
int i, j;
i = str.find(",");//i是第一个逗号的位置;
str.erase(i,1);//把第一个逗号删了,现在i指的是s1首字母的位置
j = str.find(",");//j是第二个逗号的位置
str.erase(j,1);//把第二个逗号删了,现在j指的是s2首字母的位置
s1.insert(s1.begin(), str.begin() + i, str.begin() + j);
s2.insert(s2.begin(), str.begin() + j, str.end());
str.erase(i);
//开始查找子串
//如果没有这两个子串,输出-1
if (str.find(s1)==string::npos|| str.find(s2)==string::npos){
printf("-1");
return 0;
}
int begin = str.find(s1);
begin += s1.length() - 1;
int end = str.length() - s2.length();
int lengthb = s2.length();
for (end; end >= begin; end--) {
if (str.substr(end, lengthb) == s2) {
printf("%d", end - begin - 1);
return 0;
}
}
printf("-1");
return 0;
}