首页 > 代码库 > KMP子串搜索算法C语言实现
KMP子串搜索算法C语言实现
KMP算法是在已知模式串的next函数值的基础上执行的,此函数值仅取决 于模式串本身而和相匹配的主串无关,相当于离线计算好模式串的next函数值,KMP搜索子串过程中产生“失配”时,保持主串指针不变,通过查表确定next[j],移动模式串的指针到该位置再进行比较。主要是next函数值的确定。下面给出我整理的程序。
//KMP算法查找子串程序 #include<stdio.h> #include<string.h> //根据模式串计算next函数值 void get_next(const char *pattern,int next[]) { unsigned int i = 0; int j = -1; next[0] = -1; while(i < strlen(pattern)) { if(j == -1 || pattern[i] == pattern[j]) { ++i; ++j; next[i] = j; // } else j = next[j]; } } //Index_KMP函数,string为主串,pattern为模式串,pos为主串中开始搜索的位置,next数组存储next函数值 int Index_KMP(const char *string,const char *pattern,int pos,int next[]) { unsigned int i = pos; int j = 0; unsigned int slen,plen; slen = strlen(string); plen = strlen(pattern); if(slen < plen) return 0; //unsigned int slen,plen; while(i < slen && j < plen) { if( j == -1 || string[i] == pattern[j]) { ++i; ++j; } else j = next[j]; } if(j >= plen) return i- plen; else return 0; } void main() { int i,j; int next[5] = {0}; get_next("abcac",next); //{-1,0,0,0,1} next函数值为-1表示主串指针向右移一位,再与模式串的首字符开始比较 for(i = 0;i < 5;i++) printf("%d ",next[i]); printf("\n"); i = Index_KMP("ababcabcacbab","abcac",0,next); j = Index_KMP("aba","abcac",0,next); printf("%d\n",i);//5 printf("%d\n",j);//0 }
KMP子串搜索算法C语言实现
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。