前后重叠的最长子串(题目来源:九度OJ 1535题)

以下的题目链接和描述:http://ac.jobdu.com/problem.php?pid=1535

题目描述:

给定两个字符串,求它们前后重叠的最长子串的长度,比如"abcde"和“cdefg”是"cde",长度为3。

输入:

输入可能包含多个测试案例。
对于每个测试案例只有一行, 包含两个字符串。字符串长度不超过1000000,仅包含字符'a'-'z'。

输出:

对应每个测试案例,输出它们前后重叠的最长子串的长度。

样例输入:
abcde cdefg
样例输出:
3

下面是我的思路:

假设输入的是s和t字符串,而s的长度为len_s,t的长度为len_t。要从s的尾部开始找尽可能多的字符串和t的头部匹配,那么直接找t[0]在s串中与其相同的字符所在位置i开始向后判断,判断s从i到len_s的字符与t串前len_s-i个字符是否相同。(s,t串均从位置0开始)

以下是我AC的代码:

#include"stdio.h"
#include"string.h"

#define M 1000010//这是我一开始WA的地方,题目要求1000000,我还耿直地设为1000000,搞到最后才发现数组开得小了。汗死。。

int judge(char *s,char *t,int low,int high)
{
	int index_t = 0;
	int len_t = strlen(t);
	while(low <= high)
	{
		if(s[low] != t[index_t]) return 0;
		++low;
		++index_t;
	}
	return 1;
}

int main()
{
	char s[M],t[M];
	int len_s,len_t,i,flag;
	while(~scanf("%s%s",s,t))
	{
		flag = 0;
		len_s = strlen(s);
		len_t = strlen(t);
		i = len_s > len_t ? len_s-len_t : 0;//减少判断,s串短,从0开始判断,s串长,从len_s-len_t位置开始判断。
		for(; i < len_s ;++i)
		{
			if(s[i] == t[0] && judge(s,t,i,len_s -1))
			{ 
				printf("%d\n",len_s - i);
				flag = 1;
				break;
			}
		}
		if(!flag) printf("0\n");
	}
	return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章