kmp模式匹配算法

来源:互联网 发布:mac 桌面便签 新建 编辑:程序博客网 时间:2024/06/11 06:02



注意 :next数组中,最大的数表示字符串中最长的回文串的长度,回文串可以看成自己的前缀和后缀组成,日后可以用来解决不少问题。

#include <iostream>#include<string.h>using namespace std;void get_next(char*t, int next[ ]){//确定匹配失败的时候模式串返回的位置  int t_len=strlen(t),i=0,j=-1; next[0]=-1; //递推基本条件,然后求解next[i+1] while(i<t_len) {   if(j==-1 ||t[i]==t[j])     {    i++;    j++;    next[i]=j;   }   else       j=next[j]; //确定匹配失败的时候模式串返回的位置  }}int KMP(char *s,char *t){  int i=0, j=0; int s_len=strlen(s); int t_len=strlen(t); int *next=new int[t_len]; get_next(t,next); while(i<s_len&&j<t_len) {  if(j==-1||s[i]==t[j])// next[0]=-1  {   i++;  j++;      }  else  j=next[j]; } if(j==t_len)  return i-j; else  return -1;}int main(void){  char *s="abcdasdefghijklmnefgh";  char *t="efgh";  cout<<KMP(s,t)<<endl;//输出了模式串t在s中第一个字符的位置    return 0;}


0 0