kmp

原创 2013年12月04日 16:58:58

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;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

字符串查找KMP算法

HDU 1711 Number Sequence (kmp 已被搞死。)

KMP算法

kmp算法源码

KMP算法汇总

  • 2015-09-22 16:40
  • 723KB
  • 下载

KMP算法详解

引记     此前一天,一位MS的朋友邀我一起去与他讨论快速排序,红黑树,字典树,B树、后缀树,包括KMP算法,唯独在讲解KMP算法的时候,言语磕磕碰碰,我想,原因有二:1、博客内的东西不常回顾,忘...

kmp算法代码

KMP算法查找

  • 2014-08-14 11:48
  • 684B
  • 下载

数据结构实验之串三:KMP应用

Problem Description有n个小朋友,每个小朋友手里有一些糖块,现在这些小朋友排成一排,编号是由1到n。现在给出m个数,能不能唯一的确定一对值l和r(l <= r),使得这m个数刚好是第...

kmp无回溯算法

内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)