『演算法』——字串模式匹配演算法1【BF演算法】
阿新 • • 發佈:2021-01-11
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(m∗n),其中m,n分別為主串、模式串的長度
- 空間複雜度: O ( 1 ) O(1) O(1)