/**
* KMP算法:每当一趟匹配过程中出现字符比较不等时,不需要回溯i指针,
而是利用已经得到的部分匹配的结果将模式向右滑动尽可能远的一段距离后,继续比较
设主串为 s1s2s3...sn,模式串为p1p2p3..pm
需要解决的问题: 当主串中第i和字符与模式串中第j个字符失配时,需要和模式串中哪个字符再比较?
假设需要和模式串中第k个字符比较,则
p1p2p3...pk-1 = si-k+1...si-1
已经得到的部分匹配的结果是
pj-k+1pj-k+2...pj-1 = si-k+1...si-1
由上可知 p1p2p3...pk-1 = pj-k+1pj-k+2...pj-1
若令next[j] = k;则表示当模式中第j个字符与主串失配时,应该与模式中第k个字符继续比较
以下为KMP算法:
*/
int next[m];
int KMP(char * s, char * p, int pos)
{
int len = strlen(s);
int i=pos, j=0, p_len = strlen(p);
while(i<len && j<p_len)
{
if(s[i]==p[j] || j==0)
i++;j++;
else
j = next[j];
}
if(j>p_len)return i;//匹配成功
return -1;
}
//生成next的原始算法:
void get_next(char *t, int *next)
{
int i=1, j=0, p_len = strlen(t);
next[0] = 0;
while(j<p_len)
{
if(j==0 || t[i]==t[j])
i++;j++;next[i]=j;
else
j = next[j];
}
}
//改进后的算法
void get_next(char *t, int *next)
{
int i=1, j=0, p_len = strlen(t);
next[0] = 0;
while(j<p_len)
{
if(j==0 || t[i]==t[j])
{
i++;j++;
if(t[i]==t[j])
next[i] = next[j];
else
next[i] = j;
}
else
j = next[j];
}
}
数据结构笔记-KMP算法
最新推荐文章于 2024-10-20 09:00:00 发布