kmp模式匹配算法



注意 :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;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值