串的模式匹配--KMP算法

刚学完数据结构中串的内容,捣鼓了两天,总算是弄明白了串的模式匹配中的KMP算法,所谓的KMP算法,就是当用于匹配的串中出现重复的字符时,通过一个next数组记录重复的信息,再在匹配中跳过这些已经比较过的重复信息。
那么next数组时什么东西,应该怎么求呢?不妨规定next[0]=-1,next[j]表示t[j]前有多少个与开头字符相同的字符,其他情况下next[j]=0。以t串"aaab"为例,求出t串对应的next数组在这里插入图片描述

next[j]=-1说明模式串前没有任何可以加速匹配的信息,下一趟应从t串的开头即j=0时开始匹配,如t=“abcd”,则next[0]=next[1]=next[2]=next[3]=-1.而next[j]=k说明t[j]前有k个字符已经匹配成功
再比如t=“ababc”,其对应的next数组
在这里插入图片描述
代码实现如下:

在这里插入代码片
#include <stdio.h>
int maxsubstr(char s[],char t[])
{
int i=0,j=0,len1=strlen(s),len2=strlen(t);
int* next=(int*)malloc(len2*sizeof(int));//为next数组分配len2个元素的空间
for(i=0;i<len2;i++)//对next数组初始化
next[i]=0;
int k=-1;
next[0]=-1;
//求next数组
while(j<len2-1)
{
if(k==-1||t[j]==t[k])
{
j++;
k++;
next[j]=k;//从j=1时开始对next赋值
}
else
k=next[k];//没有已匹配的信息时则k回退
}
i=0;
j=0;
while(i<len1&&j<len2)
{
if(j==-1||s[i]==t[j])
{
i++;
j++;
}
else
j=next[j];//匹配不成功时j回退
}
if(j>=len2)//当j越出t串的界时说明匹配成功
return i-len2;//返回匹配成功时的首字符的下标
else
return -1;//匹配失败则返回-1
}

int main()
{
char s[]="aaaab";
char t[]="aaab";
int ret=maxsubstr(s,t);
printf("%d\n",ret);
return 0;
}

编写不容易,还请各位大佬留下一个小小的赞~

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值