串的模式匹配,KMP算法(解释+源码)

本文深入解析KMP算法的关键点,包括如何确定后移位数,依赖于最长公共前缀和后缀,通过实例说明匹配过程中的子串和主串比较策略,以及在失配情况下的处理方法。

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

解释大部分是直接copy《王道数据结构》

还有一些是自己总结的,可能有些不太对,还请大家指出

KMP算法

关键点:后移多少位,取决于最长的公共前缀和后缀。

例如:abcabcd

a --> 0

ab --> 0

abc --> a/ab  c/bc --> 0

abca --> a/ab/abc  a/ca/bca --> 1

abcab --> a/ab/abc/abca  b/ab/cab/bcab --> 2

abcabc --> a/ab/abc/abca/abcab   c/bc/abc/cabc/bcabc -->3

abcabcd --> a/ab/abc/abca/abcab/abcabc  d/cd/bcd/abcd/cabcd/bcabcd --> 0

在实际匹配过程中,子串在内存里是不会移动的,而是指针在变化,书中画图举例只是为了让问题描述得更加形象。

若子串j==0时:子串的第j个字符和主串的第i个字符不等时,则主串应从i+1个字符继续与子串的第j个字符进行比较。

若子串j!=0时:子串的第j个字符与主串第i个字符发生失配时,则跳到子串的next[j-1](即前一个元素的部分匹配值)位置重新与主串第i个字符位置进行比较。

公众号:拾一札记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值