KMP字符串模式匹配算法.doc_第1页
KMP字符串模式匹配算法.doc_第2页
KMP字符串模式匹配算法.doc_第3页
KMP字符串模式匹配算法.doc_第4页
KMP字符串模式匹配算法.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

KMP算法是一种用于字符串匹配的算法,这个算法的高效之处在于当在某个位置匹配不成功的时候可以根据之前的匹配结果从模式字符串的另一个位置开始,而不必从头开始匹配字符串.因此这个算法的关键在于,当某个位置的匹配不成功的时候,应该从模式字符串的哪一个位置开始新的比较.假设这个值存放在一个next数组中,其中next数组中的元素满足这个条件:nextj = k,表示的是当模式字符串中的第j + 1个(这里是遵守标准C语言中数组元素从0开始的约定,以下不再说明)发生匹配不成功的情况时,应该从模式字符串的第k + 1个字符开始新的匹配.如果已经得到了模式字符串的next数组,那么KMP算法的实现如下:/ KMP字符串模式匹配算法/ 输入: S是主串,T是模式串,pos是S中的起始位置/ 输出: 如果匹配成功返回起始位置,否则返回-1int KMP(PString S, PString T, int pos) assert(NULL != S); assert(NULL != T); assert(pos = 0); assert(pos length); if (S-length length) return -1; printf(主串t = %sn, S-str); printf(模式串t = %sn, T-str); int *next = (int *)malloc(T-length * sizeof(int); / 得到模式串的next数组 GetNextArray(T, next); int i, j; for (i = pos, j = 0; i length & j length; ) / i是主串游标,j是模式串游标 if (-1 = j | / 模式串游标已经回退到第一个位置 S-stri = T-strj) / 当前字符匹配成功 / 满足以上两种情况时两个游标都要向前进一步 +i; +j; else / 匹配不成功,模式串游标回退到当前字符的next值 j = nextj; free(next); if (j = T-length) / 匹配成功 return i - T-length; else / 匹配不成功 return -1; 下面看看如何得到next数组.这是一个递推求解的过程,初始的情况是next0 = -1.假设在某一个时刻有如下的等式成立:str0.k-1 = strj - k.j - 1,那么nextj = k,在这个前提下,继续进行下一个字符的匹配.1)如果str0.k = strj - k.j,那么nextj + 1 = nextj + 1 = k + 1.2)反之,如果上面的匹配不成立,那么就要从nextk开始进行新的匹配,如果成功的话,那么:nextj + 1 = nextnextj + 1 = nextk + 1;如果还是不能匹配成功就再从nextnextk的位置开始进行的新的匹配,直到匹配成功为止.如果这个过程一直进行下去都没有找到可以成功匹配的字符的话,那么nextj + 1 = 0,这时表示要从字符串的第一个位置开始新的匹配了.用一个公式表示上述的算法,那么可以写作:nextj = 1)-1,当j = 0时; 2) Maxk | 0 = k length 0 ); / 第一个字符的next值是-1,因为C中的数组是从0开始的 next 0 = - 1 ; for ( int i = 0 , j = - 1 ; i length - 1 ; ) / i是主串的游标,j是模式串的游标 / 这里的主串和模式串都是同一个字符串 if ( - 1 = j | / 如果模式串游标已经回退到第一个字符 pstr - stri = pstr - strj) / 如果匹配成功 / 两个游标都向前走一步 + i; + j; / 存放当前的next值为此时模式串的游标值 nexti = j; else / 匹配不成功j就回退到上一个next值 j = nextj; 完整算法如下:#include #include #include #include #define MAX_LEN_OF_STR 30 / 字符串的最大长度 typedef struct String / 这里需要的字符串数组,存放字符串及其长度 char strMAX_LEN_OF_STR; / 字符数组 int length; / 字符串的实际长度 String, * PString; / 得到字符串的next数组 void GetNextArray(PString pstr, int next) assert(NULL != pstr); assert(NULL != next); assert(pstr - length 0 ); / 第一个字符的next值是-1,因为C中的数组是从0开始的 next 0 = - 1 ; for ( int i = 0 , j = - 1 ; i length - 1 ; ) / i是主串的游标,j是模式串的游标 / 这里的主串和模式串都是同一个字符串 if ( - 1 = j | / 如果模式串游标已经回退到第一个字符 pstr - stri = pstr - strj) / 如果匹配成功 / 两个游标都向前走一步 + i; + j; / 存放当前的next值为此时模式串的游标值 nexti = j; else / 匹配不成功j就回退到上一个next值 j = nextj; / KMP字符串模式匹配算法 / 输入: S是主串,T是模式串,pos是S中的起始位置 / 输出: 如果匹配成功返回起始位置,否则返回-1 int KMP(PString S, PString T, int pos) assert(NULL != S); assert(NULL != T); assert(pos = 0 ); assert(pos length); if (S - length length) return - 1 ; printf( 主串t = %sn , S - str); printf( 模式串t = %sn , T - str); int * next = ( int * )malloc(T - length * sizeof ( int ); / 得到模式串的next数组 GetNextArray(T, next); int i, j; for (i = pos, j = 0 ; i length & j length; ) / i是主串游标,j是模式串游标 if ( - 1 = j | / 模式串游标已经回退到第一个位置 S - stri = T - strj) / 当前字符匹配成功 / 满足以上两种情况时两个游标都

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论