『算法』——字符串模式匹配算法1【BF算法】

引言

字符串模式匹配:

\quad \quad 设 S 和 T 是给定的两个串,在主串 S 中找到模式串 T 的过程称为字符串匹配,如果在主串 S 中找到模式串 T ,则称匹配成功,函数返回 T 在 S 中首次出现的位置,否则匹配不成功,返回 -1。

例:
在这里插入图片描述
在上图中,我们试图找到模式串 T = baab,在主串 S = abcabaabcabac 中第一次出现的位置,即为红色阴影部分, T 第一次在 S 中出现的位置下标为 4 ( 字符串的首位下标是 0 ),所以返回 4。如果模式串 T 没有在主串 S 中出现,则返回 -1。

1、基本思想

BF算法,即暴力(Brute Force算法),又称朴素算法

基本思想:

\quad \quad 从主串S的第一个字符开始和模式T的第一个字符进行比较,若相等,则继续比较后者的后续字符;否则,从主串S的第二个字符开始和模式T的第一个字符进行比较,重复上述过程,直到T中的字符全部比较完毕,则说明本趟匹配成功;或S中字符全部比较晚,则说明匹配失败。

2、伪代码

1、在串S和串T中初始下标i=0和j=0
2、循环直到S或T的所有字符均未比较完:

  • 2.1 如果S[i]==T[j],继续比较S和T的下一个字符
  • 2.2 否则,将i回溯到i-j+1,j回溯到0,重新比较

3、如果T中所有字符均比较完,则匹配成功,返回匹配的起始下标;否则匹配失败,返回-1。

3、代码实现

def BF(s,t):
    i=0
    j=0
    while i<len(s) and j<len(t):
        if s[i]==t[j]:
            i+=1
            j+=1
        else:
            i=i-j+1
            j=0
    if j>=len(t):
        return i-len(t)
    else:
        return -1
if __name__=="__main__":
    s="abcabaabcabac"
    t="baab"
    b=BF(s,t)
    print(b)
  • 时间复杂度: O ( m ∗ n ) O(m*n) O(mn),其中m,n分别为主串、模式串的长度
  • 空间复杂度: O ( 1 ) O(1) O(1)

猜你喜欢

转载自blog.csdn.net/weixin_45666566/article/details/112440440