数据结构小笔记-String

本文详细介绍了字符串匹配的几种算法,包括蛮力算法、KMP算法和Boyer-Moore(BM)算法。KMP算法通过构造next[]查询表,实现时间复杂度为O(n)。BM算法则分为BC坏字符策略和GS好后缀策略,通过坏字符和好后缀表实现快速右移,提高效率。在大规模字符集中,BM算法尤其适用。最后提到了Karp-Rabin算法,通过指纹和hash值比较进行字符串匹配,时间复杂度可达O(n)。

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

学堂在线数据结构下-第十三章-串String
20220602

串(String):S[0,n)
字符串——有限字符序列。
String在结构上相当于vector。
字符的种类不多,但 串长n >> 字符种类。

串的术语——相等、子串、前缀、后缀、联系、空串。

空串 != 由空格组成的串。
空串 == 长度为0的串
空串是任何串的子串、前缀、后缀。

索引接口(indexOf(P))——判等接口(equal())的一般化推广
用于判断字符串P是否为当前字符串的子串(串匹配问题)。

-----------

串匹配——在某文本串中,查找特定模式串。

【1】蛮力(Brute-Force)匹配算法——文本串与模式串的首字符对齐,自左向右,以单字符为单位间隔,在文本串中依次移动模式串并进行比对,直到文本串与模式串在某位置完全匹配。只要某位置有一对字符失配,则模式串在该位置无法匹配。最好情况O(m);最坏情况O(nm) (其实是O((n-m)m),但n>>m>>2,所以等价于O(nm))。
文本串与模式串在蛮力算法下的每轮比对,在失配字符之前的多次单字符比对 均局部匹配——若充分利用这一信息(【记忆力】)可适当跳过(文本串中的)多个字符——将 模式串中的某字符 与 文本串中的失配字符 重新对齐(【预知力】),再重新开始下一轮比对……使模式串快速右移,减少总的比对次数,大幅提高效率。

---

20220603

【2】KMP算法——最坏情况时间复杂度也能O(n) (其实是O(n+m),但n>>m>>2,所以可记为 O(n))。
关键步骤—— 一旦失配,赋值 j = next[j];
本质——构造next[]查询表(仅取决于 模式串。模式串自身的匹配性(自匹配)——模式串的某前缀P[0,t) 与 模式串失配字符前的前缀P[0,j)中的后缀P[j-t,j) 相等—— P[0,t)==P[j-t,j) )。
模式串的自匹配性质——排除不必要的对齐位置,模式串快速右移。
模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值