字符串前缀,真前缀,后缀,真后缀

本文深入探讨了KMP算法中的核心概念——前缀函数。解释了前缀函数如何帮助在模式匹配失败后确定模式串的移动步长,避免了不必要的重复比较,显著提升了搜索效率。通过具体实例,详细阐述了前缀函数的计算过程,以及它在字符串匹配中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前缀函数

首先是前缀函数,前缀函数并不是只分析前缀,其取值同时兼顾真前缀真后缀的对应

前缀函数next[j]是指某个字符串的最长真后缀同时也是它的前缀的子串长度。

KMP中表示在一次匹配失败后模式串可以往后移动的最大步长。

//T是被匹配的串。 
//P是模式串。 
//字符串都是从下标1开始的。 
void next(char P[]) 
{ 
    int m=strlen(P+1); //这里是因为要从P[ 1 ]开始输入字符串的
    next[1]=0; 
    for(int k=0,q=2;q<=m;q++) 
//这段代码我感觉用通俗的语句说就是k是用来表示子串中前k个和后k个是相同的,
//q是用来遍历数组的需要
    { 
        while(k>0&&P[k+1]!=P[q]) //如果P[k+1]和P[q]中字符不同说明匹配是失败,
        						//要把k的值重新退到next[ k ],直到两者相同才停止。
        						//这样做的好处是没必要再重新从头再来,节约时间。
            k=next[k]; 
        if(P[k+1]==P[q]) 
            k++; 
        next[q]=k; 
    } 
} 

真前缀,真后缀,后缀

举个例子,如字符串 abcde

排除空字符,则:
所有的前缀有		a, ab, abc, abcd, abcde
其中真前缀有		a, ab, abc, abcd

可以类比中学阶段集合概念,真子集就是真前缀,空集就是空字符,子集就是所有的前缀

同理,真后缀就是指不包含自身的后缀

理解KMP模式匹配的时候会比较难理解前缀函数 next[j]

a -> 0

ab -> 0

aba -> 1

abab -> 2

ababc -> 0
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值