数据结构--KMP算法

求串的模式值next[n]

定义

1next[0]= -1 意义:任何串的第一个字符的模式值规定为-1

2next[j]= -1 意义:模式串T中下标为j的字符,如果与首字符相同,且j的前面的1—k个字符与开头的1—k个字符不等(或者相等但T[k]==T[j])(1k<j)。如:T=”abCabCad”  next[6]=-1,因T[3]=T[6]

3next[j]=k 意义:模式串T中下标为j的字符,如果j的前面k字符与开头的k个字符相等,且T[j] !=T[k] 1k<j)。T[0]T[1]T[2]。。。T[k-1]==T[j-k]T[j-k+1]T[j-k+2]…T[j-1]T[j] != T[k].1k<j;

 (4)next[j]=0 意义:除(1)(2)(3)的其他情况。


此种求值方法只要记住会用就好,这是3位名人想出的!

具体代码附下:参考(http://blog.csdn.net/x283930450/article/details/9005330)


#include <iostream>
#include <string>
using namespace std;

void get_nextval(const char *T, int next[])
{
	// 求模式串T的next函数值并存入数组 next。
	int j = 0, k = -1;
	next[0] = -1;
	while ( T[j] != '\0' )
	{
		if (k == -1 || T[j] == T[k])
		{
			++j; ++k;
			if (T[j]!=T[k])
				next[j] = k;
			else
				next[j] = next[k];
		}
		else
			k = next[k];
	}
}

int KMP(const char *Text,const char* Pattern) //const 表示函数内部不会改变这个参数的值。
{
	if( !Text||!Pattern|| Pattern[0]=='\0' || Text[0]=='\0' )//
		return -1;//空指针或空串,返回-1。
	int len=0;
	const char * c=Pattern;
	while(*c++!='\0')//移动指针比移动下标快。
	{
		++len;//字符串长度。
	}
	int *next=new int[len+1];
	get_nextval(Pattern,next);//求Pattern的next函数值
	int index=0,i=0,j=0;
	while(Text[i]!='\0' && Pattern[j]!='\0' )
	{
		if(Text[i]== Pattern[j])
		{
			++i;// 继续比较后继字符
			++j;
		}
		else
		{
			index += j-next[j];
			if(next[j]!=-1)
				j=next[j];// 模式串向右移动
			else
			{
				j=0;
				++i;
			}
		}
	}//while
	delete []next;
	if(Pattern[j]=='\0')
		return index;// 匹配成功   
	else
		return -1;
}
int main()
{
	char* text="bababCabCadcaabcaab";
	char*pattern="bCabCad";
	cout<<KMP(text,pattern)<<endl;
	return 0;
}


你可能感兴趣的:(KMP)