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