以下的题目链接和描述: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;
}