算法刻意练习之字KMP算法

1 特点

(1)KMP
在这里插入图片描述

(2)核心:KMP算法的想法是,设法利用这个已知信息,不要把"搜索位置"移回已经比较过的位置,继续把它向后移,这样就提高了效率

2 举例分析 字符串匹配的KMP算法

有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?

2.1 《部分匹配表》是如何产生的

(1)“前缀"和"后缀”。 "前缀"指除了最后一个字符以外,一个字符串的全部头部组合"后缀"指除了第一个字符以外,一个字符串的全部尾部组合

(2)"部分匹配值"就是"前缀"和"后缀"的最长的共有元素的长度

(3)以"ABCDABD"为例,部分匹配表是:
在这里插入图片描述

- "A"的前缀和后缀都为空集,共有元素的长度为0;

- "AB"的前缀为[A],后缀为[B],共有元素的长度为0;

- "ABC"的前缀为[A, AB],后缀为[BC, C],共有元素的长度0;

- "ABCD"的前缀为[A, AB, ABC],后缀为[BCD, CD, D],共有元素的长度为0;

- "ABCDA"的前缀为[A, AB, ABC, ABCD],后缀为[BCDA, CDA, DA, A],共有元素为"A",长度为1;

- "ABCDAB"的前缀为[A, AB, ABC, ABCD, ABCDA],后缀为[BCDAB, CDAB, DAB, AB, B],共有元素为"AB",长度为2;

- "ABCDABD"的前缀为[A, AB, ABC, ABCD, ABCDA, ABCDAB],后缀为[BCDABD, CDABD, DABD, ABD, BD, D],共有元素的长度为0。

2.2 "部分匹配"的实质

"部分匹配"的实质是,有时候,字符串头部和尾部会有重复。比如,“ABCDAB"之中有两个"AB”,那么它的"部分匹配值"就是2("AB"的长度)。搜索词移动的时候,第一个"AB"向后移动4位(字符串长度-部分匹配值),就可以来到第二个"AB"的位置

2.3 不使用KMP算法

在这里插入图片描述

2.4 使用KMP算法

2.4.1 部分匹配表

在这里插入图片描述

2.4.2 最核心匹配步骤

在这里插入图片描述

2.4.3 KMP算法匹配过程

在这里插入图片描述

3 举例分析

有一个字符串"aaaaaaaaab",我想知道,里面是否包含另一个字符串"aaaab"?

3.1 最核心匹配步骤

在这里插入图片描述

3.2 KMP算法匹配过程 KMP字符串匹配算法1 KMP字符串匹配算法2

(1)
在这里插入图片描述
(2)
在这里插入图片描述
(3)
在这里插入图片描述
(4)
在这里插入图片描述

4 举例分析

有一个字符串"abaacababcac",我想知道,里面是否包含另一个字符串"ababc"?

4.1 最核心匹配步骤

在这里插入图片描述

4.2 部分匹配表

(1)
在这里插入图片描述
(2)
在这里插入图片描述

4.3 KMP算法匹配过程

(1)
在这里插入图片描述
(2)
在这里插入图片描述
(3)
在这里插入图片描述
(4)
在这里插入图片描述
(5)
在这里插入图片描述
(6)
在这里插入图片描述
(7)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值