字符串匹配kmp算法实现

这篇博客详细介绍了KMP字符串匹配算法的原理,包括如何拆解字符串、计算最长公共前后缀,并给出了C语言实现的完整代码。通过观看B站灯笼大神的讲解视频av11866460和av16828557,读者可以深入理解KMP算法。
摘要由CSDN通过智能技术生成

B站灯笼大神的讲解视频:
av11866460 av16828557

1、把要匹配的字符串拆解成若干个子字符串
2、对于每一个子字符串(除了要匹配的字符串其本身),找出其中最长公共前后缀长度。
3、前缀表第一位补-1,其余位,顺位补最长公共前后缀长度的值。

首先是获取前缀表:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void prefix_table(char *pattern, int *prefix, int n)
{
   
	//首先默认的将前缀表第一个空格写 0
    prefix[0] = 0;
    //i 和 len 用来作为比较字符时候的移动下标 len从下标0处开始
    int len = 0;
    //因为前缀表第一个空格已经是0 所以i从下标为1开始
    int i = 1;
    // n是整个pattern串的长度
    while( i < n )
    {
   
    	//当这两个字符相同时
        if( pattern[len] == pattern[i] )
        {
   
        	//len自增,以待进行下一次比对
            len++;
            //这时候由于字符相同,最长公共前缀增加了1,也就是len自增的结果
            prefix[i] = len;
            //i自增,以待下一次比对
            i++;
        }
        //如果不相同的话
        else
        {
   
        	// len>0是为了防止内存越界
            if( len > 0 )
            {
   
            	// 那么len 就等于prefix[len]值,斜着指向
                len = prefix[len-1];
            }
            else
            {
   
            //如果len==0或者len<0就让串回到最开始的地方开始比较
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值