串的模式匹配之BF算法
众所周知,暴力算法能够解决很多问题,因为暴力算法枚举出了每一种情况然后去讨论是否成立,这导致了暴力算法虽然很有效但是有时人们不想使用它,因为它要将每一种情况都讨论了,这在情况很多的情况下几乎不具有可行性,但是暴力算法是很有效的。
BF算法就是一种暴力算法,在串的模式匹配中BF算法就从第一种可能的情况开始进行枚举验证直到匹配成功或者已经检验完所有可能的情况也没有匹配成功(匹配失败)。
BF算法很符合我们的直觉,想象一下,有这样两个串
S
=
"
C
1
C
2
.
.
.
C
n
"
S="C_1C_2...C_n"
S="C1C2...Cn"
T
=
"
D
1
D
2
.
.
.
D
m
"
T="D_1D_2...D_m"
T="D1D2...Dm"
其中T串的长度小于等于S串(否则的话T串不可能是S的子串),如果T串是S串的一个子串,那么在S串中一定存在这样一个串
S
子
=
"
S
x
S
x
+
1
.
.
.
S
x
+
m
−
1
"
S_子="S_xS_{x+1}...S_{x+m-1}"
S子="SxSx+1...Sx+m−1"使得
S
子
=
T
S_子=T
S子=T
上面这两段话表示如果T串是S串的一个子串的话,一定能从S串的某个位
置x开始找到连续的n个字符,这连续的n个字符组成的串与T串相等
画出图示则是这样的
如果T串是S串的一个子串,那么说明,一定可以在串S中找到一段子序列使得子序列与串T相等。
也就是说,我们要让串T与串S进行模式匹配,其实就是找一段S串中的子序列,这个子序列中的字符与串T对应相等,但是我们并不知道这一个子序列从哪里开始,甚至我们都不知道是否存在这样一个子序列。那么怎么查看是否存在这样一个子序列呢?我们知道如果存在这样一个子序列使得
S
子
=
T
S_子=T
S子=T
那么存在
S
子
[
i
]
=
T
[
i
]
(
i
=
0
,
1
,
2...
m
)
S_子[i]=T[i] \ \ (i = 0, 1,2...m)
S子[i]=T[i] (i=0,1,2...m)
那么我们就先寻找T[0]在S中的什么位置,按照图示就可画成这样:
如此寻找下去如果找到了这样一个字符,我们就可以接着进行验证剩余的对应字符。
当所有的字符都匹配上了,我们就说在T串是S串的一个子串,其中有一个环节没有匹配上,那么就说明要么首字符没有匹配上要么中间字符没有匹配上,那么我们就说T串不是S串的一个子串。
这就是串的模式匹配的BF算法,很容易想明白。
串。
好的小伙伴们,今天的分享到此为止,期待下一次的与大家分享,