KMP算法

KMP算法的思路为:S为目标串,T为模式串,若S[i] = T[j],ij分别增1,否则,i不变j退回到j = next[j]的位置,这是的j可能出现两种情况:一种是j退回到某个j=next[j]位置时有S[i] = T[j],则指针各增1后继续匹配;另一种情况是j退回到j = -1时,此时令I,j指针各增1,即下一次比较S[I + 1]T[0]。可是还是不太懂next数组是怎么回事,如果有高手能帮忙解释下,小弟在这里先谢谢了。

 

下面代码大部分来自课本:

#include

using namespace std;

void getNext(char T[],int next[])

{

         //next数组用来保存next数组的值

         //T数组是T模式串

         int j,k;

         j = 0;

         k = -1;

         next[0] = -1;

         int length = strlen(T);

         while(j < length - 1)

         {

                   if(k == -1 || T[j] == T[k])

                   {

                            j++;

                            k++;

                            next[j] = k;

                   }

                   else k = next[k];

         }

}

 

int TestKMP(char T[],char S[])

{

         int i,j;

         int next[50];

         getNext(T,next);

         i = j = 0;

         int s_length = strlen(S);

         int t_length = strlen(T);

         while(i < s_length && j < t_length)

         {

                   if( j == -1 || S[i] == T[j])//如果next数组中出现了-1或者S[i]T[j]匹配

                   {

                            i++;

                            j++;

                   }

                   else j = next[j];//否则让S[i]T[ next[j]) ]比较是否匹配

         }

         if(j >= t_length)//比较匹配次数大于或等于T串的长度,说明匹配成功

         {

                   return (i - t_length + 1);//返回匹配开始的位置,因为数组是从0开始的,所以加1

         }

         else return (-1);

}

 

void main()

{

         int next[20] = {0};

         char T[20],S[50];

         cout<<"请输入T串和S"<<endl;

         cin>>T>>S;

         int location =TestKMP(T,S);

         if(location > 0)cout<<"匹配成功,位置在"<<location<<endl;

         else cout<<"匹配不成功"<<endl;

}

如果你发现了代码的错误和不足,欢迎指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值