1. 程式人生 > 其它 >『演算法』——字串模式匹配演算法1【BF演算法】

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

技術標籤:# 演算法資料結構與演算法字串模式匹配BF

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)