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字符串查找

KMP算法 KMP字符串查找算法的目的是减少不必要的比较次数,举个简单的例子,从字符串A:"abcdeabcdfg"中查找字符串B:"abcdf"。 使用普通的查找法查找字符串的步骤是这样的: 先拿A...
  • girlkoo
  • girlkoo
  • 2013年12月20日 09:31
  • 4062

扩展kmp详解

转自http://blog.csdn.net/dyx404514/article/details/41831947 算法总结第二弹,上次总结了下kmp,这次就来拓展kmp吧。 拓展kmp是对...
  • discreeter
  • discreeter
  • 2016年07月25日 11:48
  • 3008

字符串匹配算法KMP详细解释——深入理解

1. 前言  字符串匹配是一个经典算法问题,展开来讲各类问题多达几十种,有名称的算法也不下三十种,所以需要深入学习的东西有很多。这次我们来探讨一个最简单的问题,假设现在随机输入一个长度为m的主串T,另...
  • FX677588
  • FX677588
  • 2016年12月04日 16:09
  • 3584

Trie、KMP、AC自动机小结

最近做了不字符串的题,做下小结吧~          首先是Trie(也叫前缀树),Trie的结构并不难理解,Trie是个树形结构,它的每条边对应一个字符,每个节点对应一个字符串的前缀(根节点对应空串...
  • qian99
  • qian99
  • 2014年02月05日 21:58
  • 1470

Oulipo 哈希代替KMP再做字符串处理

Oulipo Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 39845   Accepted: 16034 ...
  • major_zhang
  • major_zhang
  • 2017年04月18日 22:34
  • 382

hdu__KMP算法模板题【持续更新中】

剪花布条                                                                           Time Limit: 1000/1000...
  • ACMore_Xiong
  • ACMore_Xiong
  • 2015年08月22日 12:08
  • 3099

KMP入门(最详细最好用)

从头到尾彻底理解KMP 作者:July 时间:最初写于2011年12月,2014年7月21日晚10点 全部删除重写成此文,随后的半个多月不断反复改进。 1...
  • u013076044
  • u013076044
  • 2014年12月09日 23:31
  • 1399

KMP与扩展KMP必须得过!!!

// first used normal KMP qiuxunhuanjie //then extend to do it KMP 扩展KMP未过,明日再看 #include using names...
  • Timsei
  • Timsei
  • 2017年05月24日 15:31
  • 306

kmp习题大全

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=70325#overview kuangbin带你飞专题十六kmp&扩展kmp&manach...
  • qq_30241305
  • qq_30241305
  • 2016年02月19日 20:28
  • 1516

编程小白眼中的KMP-----C++实现

KMP起源于字符串的匹配,顾名思义匹配字符就是看2串字符是能匹配上,比如说字符串S=”abcd”字符串T=”abc”,就可以匹配上,返回的是第一个匹配的位置,也就是1。1、最基本的匹配。从原字符串开始...
  • a1b2c3d4123456
  • a1b2c3d4123456
  • 2016年01月12日 20:03
  • 1473
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:kmp
举报原因:
原因补充:

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