学堂在线数据结构下-第十三章-串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) )。
模式串的自匹配性质——排除不必要的对齐位置,模式串快速右移。
模式