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算法解释

  • 2017年11月29日 11:14
  • 175KB
  • 下载

C#实现-模式串匹配-KMP

  • 2017年11月19日 14:51
  • 33KB
  • 下载

字符串匹配算法(KMP、BM和Sunday),及Python实现

 分类: Python/Ruby 这篇博客主要对三种字符串匹配算法(KMP、BM、Sunday)进行总结。这三种字符串匹配算法之间的主要区别在于:如果在匹配过程中遇到一个不匹配位,该用...

KMP算法.ppt

  • 2017年10月30日 23:14
  • 269KB
  • 下载

kmp算法源码

  • 2015年08月16日 10:37
  • 3KB
  • 下载

NYOj-1085-数单词改编-KMP

数单词 时间限制:2000 ms  |  内存限制:120000 KB 难度:4 描述 为了能够顺利通过英语四六级考试,现在大家每天早上都会早起读英语。 LYH本来以为自...

KMP算法汇总

  • 2015年09月22日 16:40
  • 723KB
  • 下载

kmp算法代码

  • 2014年06月28日 13:08
  • 2KB
  • 下载

从头到尾彻底理解KMP(2014年8月22日版)

从头到尾彻底理解KMP 作者:July 时间:最初写于2011年12月,2014年7月21日晚10点 全部删除重写成此文,随后的半个多月不断反复改进。后收录于新书《编程之法:面试和算法心得》第4....
  • v_JULY_v
  • v_JULY_v
  • 2011年12月05日 13:05
  • 298446

字符串查找KMP算法

  • 2017年08月22日 17:45
  • 2KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:kmp
举报原因:
原因补充:

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