先来看基本的串的匹配算法。
给定一父串和一子串,判断子串是否匹配父串,匹配则返回父串开始匹配处的坐标,不匹配则返回-1.可配合下面的过程图看代码:
#include <stdio.h>
#include <string.h>
int Index(char s[], char t[], int pos)//s存放父串,t放子串。
{
int i,j,slen,tlen;//i,j代表游标,分别指向父串和子串
i = pos;//父串从pos位置开始
j = 0;
slen = strlen(s);
tlen = strlen(t);
while( i<slen && j<tlen)
{
if( s[i]==t[j] )
{
i++;
j++;
}
else
{
i = i-j+1;//不能写成i=1是因为pos不一定从0开始
j = 0;
}
}
if( j >= tlen)
return i-tlen;//返回父串匹配子串开始点的下标
else
return -1;//没有匹配则返回-1
}
int main()
{
char s[]="goodgoogle";
char t[]="google";
int index = Index(s,t,0);
printf("%d\n",index);//应该返回4
return 0;
}
KMP算法:
参考:http://blog.sina.com.cn/s/blog_67947d740100nwwl.html
#include <stdio.h>
#include <string.h>
void GetNext(char t[],int next[])
{
int i, j, tlen;
tlen = strlen(t);
i = 0;
j = -1;
next[0] = -1;
while(i < tlen)
{
if((j == -1) || (t[i] == t[j]))
{
i++;
j++;
next[i] = j;
}
else
{
j = next[j];
}
}
}
int Index(char s[], char t[], int pos)//s存放父串,t放子串。
{
int next[255];
int i,j,slen,tlen;//i,j代表游标,分别指向父串和子串
i = pos;//父串从pos位置开始
j = -1;
slen = strlen(s);
tlen = strlen(t);
GetNext(t,next);
while( i<slen && j<tlen)
{
if( j==-1 || s[i]==t[j] )
{
i++;
j++;
}
else
{
j = next[j];
}
}
if( j >= tlen)
return i-tlen;//返回父串匹配子串开始点的下标
else
return -1;//没有匹配则返回-1
}
int main()
{
int index;
char s[]="goodgoogle";
char t[]="ababaaaba";
index = Index(s,t,0);
printf("%d\n",index);//应该返回4
return 0;
}