重啓c語言之串——串的模式匹配

串的模式匹配

給定一個主串S(長度<=10^6)和一個模式串T(在長度<=10的五次冪),要求在主串S中找出與模式T相匹配的子串,返回相匹配的子串中的第一個字符在主串S中出現的位置。

輸入格式:
輸入有兩行: 第一行是主串S; 第二行是模式T.

輸出格式:
輸出相匹配的子串中的第一個字符在主串S中出現的位置。若匹配失敗,輸出0.

輸入樣例:
在這裏給出一組輸入。例如:

aaaaaba
ba

輸出樣例:
在這裏給出相應的輸出。例如:

6

思路:採用kmp算法進行匹配。以空間換取時間。具體的幾個點在於next數組的求解、kmp算法。首先我們需要求出next數組,因爲next數組中的值只和模式串有關,因此只需知道模式串的值即可得到對應的next數組的值。kmp算法就是模式匹配下的情況,整體的代碼如下所示:

#include<stdio.h>
#include<string.h> 
#include<stdlib.h>
 int next[100001];
 void get_next(char*t,int*next)
 {
 	int i=0;//next數組的下標
	 int j=-1;//next的值
	 next[0] =-1;//防止進入死循環,而且到不能匹配時能整體後移
	 while(t[i]!='\0')
	 {
	 	if(j==-1||t[i]==t[j])  //j=-1進入這個循環是爲了整體向後移;
	 	{
	 		//如果不存在或者條件符合,可得到next的值
			i++;j++;
			next[i]=j;
		 }
		 else
		 j=next[j];	 
	 }
 }
 int KMP(char*s,char*t,int pos)//pos爲s串的起始比較位置 
 {
 	int j=0;
	 while(t[j++]!='\0');
	 int *next=(int*)malloc((j-1)*sizeof(int));
	 int length=j-1;//串的長度
	 //調用函數,生成對應的next值
	 get_next(t,next);
	 int i=pos-1;//主串起始位置
	 j=0;//模式串下標
	 while(s[i]!='\0'&&j<length)
	 {
	 	if(j==-1||s[i]==t[j])
	 	{
	 		i++;j++;
		 }
		 else
		 {
		 	j=next[j];//如果不等,則從next值開始下一次比較 
		 }
	  } 
	  if(t[j]=='\0'&&j!=-1)
	  return i-j+1;
	  else
	  return 0; 
  } 
 int main()
{
	char s[1000001],t[100001];
	int len;
	gets(s);
	gets(t);
	len=strlen(t);
	get_next(t,next);
    printf("%d",KMP(s,t,1));
 } 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章