前後重疊的最長子串(題目來源:九度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;
}



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