首先盼明天的腾讯面试顺利,看了几篇面经,还是想把KMP算法重新看一下。
首先要说的就是Next数组了,网上的大牛写的一段代码:
void get_nextval(const char *T, int next[])
{
// 求模式串T的next函数值并存入数组 next。
int j = 0, k = -1;
next[0] = -1;
while ( T[j] != '\0' )
{
if (k == -1 || T[j] == T[k])
{
++j; ++k;
if (T[j]!=T[k])
next[j] = k;
else
next[j] = next[k];
}// if
else
k = next[k];
}// while
}
下面是我写的KMP实验代码:
代码功能为指出可以匹配t串的s串的各个匹配位置
#include<iostream>
using namespace std;
#include<string.h>
int nextx[100];
char s[20]="abcabcabdabba";
char t[]="ab";
int flag=0;
void get_nextval(const char *T, int next[])
{
// 求模式串T的next函数值并存入数组 next。
int j = 0, k = -1;
next[0] = -1;
while ( T[j] != '\0' )
{
if (k == -1 || T[j] == T[k])
{
++j; ++k;
if (T[j]!=T[k])
next[j] = k;
else
next[j] = next[k];
}// if
else
k = next[k];
}// while
}
int match(int s_len,int t_len)
{
int pos_s=0,pos_t=0;
while(pos_s<s_len)
{
if(s[pos_s]==t[pos_t])
{
pos_s++;
pos_t++;
}
else {
if(nextx[pos_t]==-1)
{
pos_t=0;
pos_s++;
}
else
pos_t=nextx[pos_t];
}
if(pos_t==t_len)
{
printf("%d\n",pos_s-t_len);
pos_s++;
pos_t=0;
flag=1;
}
}
if(flag==0)
printf("not find\n");
return 0;
}
void main()
{
memset(nextx,0,sizeof(nextx));
int s_len=strlen(s);
int t_len=strlen(t);
get_nextval(t,nextx);
match(s_len,t_len);
}