四. 求串T的模式值next[n]的函数
说了这么多,是不是觉得求串T的模式值next[n]很复杂呢?要叫我写个函数出来,目前来说,我宁愿去登天。好在有现成的函数,当初发明KMP算法,写出这个函数的先辈,令我佩服得六体投地。我等后生小子,理解起来,都要反复琢磨。下面是这个函数:
void get_nextval(const char *T, int next[])
{
// 求模式串T的next函数值并存入数组 next。
int j = 0, k = -1;
next[0] = -1;
while ( T[j/*+1*/] != '\0' )
{
if (k == -1 || T[j] == T[k])
{
++j; ++k;
if (T[j]!=T[k])
next[j] = k;
else
next[j] = next[k];
}// if
else
k = next[k];
}// while
////这里是我加的显示部分
// for(int i=0;i<j;i++)
//{
// cout<<next[i];
//}
//cout<<endl;
}// get_nextval
另一种写法,也差不多。
void getNext(const char* pattern,int next[])
{
next[0]= -1;
int k=-1,j=0;
while(pattern[j] != '\0')
{
if(k!= -1 && pattern[k]!= pattern[j] )
k=next[k];
++j;++k;
if(pattern[k]== pattern[j])
next[j]=next[k];
else
next[j]=k;
}
////这里是我加的显示部分
// for(int i=0;i<j;i++)
//{
// cout<<next[i];
//}
//cout<<endl;
}
下面是KMP模式匹配程序,各位可以用他验证。记得加入上面的函数
#include <iostream.h>
#include <string.h>
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()//abCabCad
{
char* text="bababCabCadcaabcaababcbaaaabaaacababcaabc";
char*pattern="adCadCad";
//getNext(pattern,n);
//get_nextval(pattern,n);
cout<<KMP(text,pattern)<<endl;
return 0;
}
分享到:
相关推荐
### KMP字符串模式匹配详解 #### 一、引言 KMP算法,全称为Knuth-Morris-Pratt算法,是一种高效的字符串模式匹配算法。它主要用于在一个文本串中寻找一个模式串的位置,相比于传统的暴力匹配算法,KMP算法能够显著...
KMP 字符串模式匹配详解及程序 KMP 字符串模式匹配是数据结构中的经典算法,用于在一个字符串中定位另一个串。简单匹配算法的时间复杂度为 O(m*n),而 KMP 匹配算法可以证明其时间复杂度为 O(m+n)。 简单匹配算法...
### KMP字符串模式匹配详解 #### 一、引言 KMP算法,全称为Knuth-Morris-Pratt算法,是一种高效的字符串模式匹配算法。它由Donald Knuth、James H. Morris以及Vaughan Pratt三位计算机科学家共同提出,旨在解决在...
《KMP字符串模式匹配详解》 KMP字符串模式匹配是一种高效地在文本串(主串)中寻找目标串(模式串)出现位置的算法。相较于简单的暴力匹配算法,KMP算法显著提高了匹配效率,时间复杂度从O(m*n)优化到了O(m+n),...
KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。可以证明它的时间复杂度为O(m+n).。先来看一个简单匹配算法的函数:此算法的思想是...
**KMP字符串模式匹配算法详解** KMP(Knuth-Morris-Pratt)算法是一种高效地在主串(text)中查找子串(pattern)的字符串模式匹配算法,由Dijkstra、Morris和Pratt在1970年提出。这个算法避免了不必要的字符比较,...
### KMP字符串匹配算法 #### 一、简介 KMP(Knuth-Morris-Pratt)算法是一种高效的字符串搜索算法,由Donald Knuth、James H. Morris和Vaughan Pratt三位计算机科学家共同提出。该算法的主要优点在于它能够有效地...
**KMP字符串匹配算法详解** KMP(Knuth-Morris-Pratt)字符串匹配算法是由D.E. Knuth、V.J. Morris和J.H. Pratt三位学者于1977年提出的,它是一种高效的字符串搜索算法,主要用于在一个主串(text)中查找是否存在...
### 字符串模式匹配KMP算法详解 #### 一、引言 在计算机科学领域,字符串模式匹配是一项基本且重要的任务。它涉及到在一个较大的文本字符串(通常称为“主串”或“目标串”)中寻找一个较小的字符串(称为“模式串...
**字符串模式匹配BF算法详解** 在信息技术领域,字符串模式匹配是一项基本且重要的任务,它用于在文本中查找是否存在特定的子串。BF算法,全称为Brute Force(暴力)算法,是最直观的一种字符串模式匹配算法。它...
本文将介绍一种名为KMP的字符串匹配算法。KMP算法(Knuth-Morris-Pratt算法)是一种高效的字符串匹配算法,由Donald Knuth、Vaughan Pratt和James H. Morris共同发明。KMP算法通过使用一个称为“部分匹配表”或...
KMP(Knuth-Morris-Pratt)算法作为一种高效的字符串匹配算法,通过预处理模式串构建一个辅助数组来避免不必要的回溯,从而显著提高了匹配效率。 #### KMP算法原理 KMP算法的核心在于构建一个**next数组**,用于...
本文将介绍一种名为KMP的字符串匹配算法。KMP算法(Knuth-Morris-Pratt算法)是一种高效的字符串匹配算法,由Donald Knuth、Vaughan Pratt和James H. Morris共同发明。KMP算法通过使用一个称为“部分匹配表”或...
KMP算法是一种高效的字符串模式匹配算法,它通过预处理模式字符串来避免重复比较,从而大大提高了搜索效率。 ##### 3.1 KMP算法原理 KMP算法的核心在于构建一个称为“部分匹配表”(Next数组)的数据结构,该表...