Alex_McAvoy

想要成为渔夫的猎手

单模式匹配

【问题描述】

在字符串的单模式匹配中,对于待匹配的长度为 $n$ 的数组 T[n]称为文本(Text),对于匹配的满足 $m\leq n$ 的长度为 $m$ 的数组 P[m] 称为模式(Pattern)

当 $0\leq s \leq n-m$ 时,若对于 $1\leq i\leq m$,有 T[s+i]=P[i] 成立,则称 $s$ 为模式 P 在文本 T 中的有效位移(Valid Shift),又称匹配点

如下图所示,要在文本 T=abcabaabcabac 中找出模式 P=abaa 的所有匹配

可以发现,模式 P 在文本 T 中,仅在位移 $s=3$ 处出现一次,即 $s=3$ 为一个匹配点

综上,字符串模式匹配,本质上就是对字符串子串的定位操作,其求的是子串在主串中的位置

在字符串模式匹配中,常用的算法有 BF 算法、MP 算法、KMP 算法等,这些算法通常都分为两个步骤:预处理(Preprocessing)、匹配(Matching),所以算法的总时间复杂度为预处理和匹配的时间复杂度的总和

常见的字符串匹配算法有:BP 算法、KMP 算法等

【PM 表】

对于一个字符串,在进行匹配时,有如下基本概念:

  • 字符串前缀除最后一个字符外字符串的头部子串集,当字符串为单个字符时,前缀为空集
  • 字符串后缀除第一个字符外字符串的尾部子串集,当字符串为单个字符时,后缀为空集
  • 相等前后缀:字符串前缀与后缀的交集
  • 部分匹配值:字符串前缀与后缀的最长的相等前后缀的长度

ababa 为例,有:

子串 前缀 后缀 相等前后缀 部分匹配值
a $0$
ab {a} {b} $0$
aba {a,ab} {a,ba} {a} $1$
abab {a,ab,aba} {a,ab,bab} {a,ab} $2$
ababa {a,ab,aba,abab} {a,ba,aba,baba} {a,aba} $3$

将一个字符串的全部子串的部分匹配值写成数组形式,即可得到部分匹配值(Partial Match)的表,即 PM 表

在上例中,ababa 的 PM 表为:

编号 0 1 2 3 4
字符 a b a b a
PM 值 0 0 1 2 3
感谢您对我的支持,让我继续努力分享有用的技术与知识点!