关闭

kmp

标签: kmp
400人阅读 评论(0) 收藏 举报
分类:

Kmp算法相对于朴素的查找子串方法的方法的优化就是可以通过模式串的滑动来节省匹配所需时间,而模式串的滑动操作最重要的就是要构建next数组,如果有了next数组,那么字符串匹配就很easy了。

如下表所示字符串,初始时将next[0]赋值为-1,将next[1]赋值为0,然后求next[i+1],需要借助next[i],j= next[i], str[i] =str[j],next[i+1] =j+1,因为str[0~j]已经和str[i – j ~i]匹配过了(如求next[4]),若str[i]=str[j], 那么就让j =next[j],然后迭代直到str[i]= str[j]或者j=-1(已到模式串首),就这样循环下去就可以求出next数组


0

1

2

3

4

5

6

7

8

9

a

b

c

a

b

d

a

b

c

d

-1

0

0

0

1

2

0

1

2

3


getNext代码及kmp代码:

void getNext(char *p,int *next)
{
    int i, j, len;
	len = strlen(p);
	next[0] = -1;
	j = -1;
	i = 0;
	while(i < len)
	{
		if(j == -1 || p[i] == p[j])
		{
			i++;
			j++;
			next[i] = j;
		}
		else
		{
			j = next[j];
		}
	}
}

int kmp(char *p1, char *p2)
{
	int i = 0, j = 0, len1, len2;
	len1 = strlen(p1);
	len2 = strlen(p2);
	while(i < len1 && j < len2)
	{
		if(j == -1 || p1[i] == p2[j])
		{
			i++;
			j++;
		}
		else
		{
			j = next[j];
		}
	}
	if(j >= len2)
	{
		return i-len2;
	}
	return -1;
}



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:69479次
    • 积分:2235
    • 等级:
    • 排名:第16894名
    • 原创:162篇
    • 转载:3篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论