串的模式匹配
給定一個主串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));
}