字符串的模式匹配:BF算法

串的模式匹配之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+m1"使得
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算法,很容易想明白。
串。
好的小伙伴们,今天的分享到此为止,期待下一次的与大家分享,
请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值