2019.2.24小白之路:NOI26-字符串最大跨距

一开始用的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;
}

猜你喜欢

转载自blog.csdn.net/shensen0304/article/details/87900856