python實現字串匹配演算法BF,BF改,KMP

2021-10-06 10:51:10 字數 2076 閱讀 1559

包含:bf,bf改進版本,kmp

bf:暴力搜尋

bf改:當判斷匹配失敗的字串是不是與首字母相同 若不同,繼續bf演算法; 若相同,直接將首字母移到當前位置

kmp:通過字首與字尾發現待匹配字串本身的特性,匹配失敗時一次性移動多個字元以減少工作量

# hstring為長字串;substring為待匹配的字串

def bf(hstring: str, substring: str):

hlen = len(hstring)

slen = len(substring)

if (hlen == 0) or (slen == 0) or (hlen < slen):

return none

for i in range(hlen - slen + 1): # 母串逐一字元匹配

is_find = true

for j in range(slen): # 迴圈子串

if hstring[i + j] != substring[j]:

is_find = false

break # 如果匹配失敗,之前所做的所有匹配工作全部捨棄,轉而開始母串下乙個字元的重新匹配

if is_find:

return i

return false

def bf_plus(hstring: str, substring: str):

hlen = len(hstring)

slen = len(substring)

if (hlen == 0) or (slen == 0) or (hlen < slen):

return none

i = 0

while i < hlen - slen:

is_find = true

for j in range(slen): # 迴圈子串

ch1 = hstring[i + j]

ch2 = substring[j]

if ch1 != ch2:

is_find = false

# 當匹配失敗時,檢查敗的字串是不是與首字母相同,若不同,繼續bf演算法;若相同,直接將首字母移到當前位置

if (ch1 == substring[0]) and (j >= 1):

ipos = i + j

i = ipos - 1

break

i += 1

if is_find:

return i - 1

return false

def kmp(hstring, substring):

hlen = len(hstring)

slen = len(substring)

if (hlen == 0) or (slen == 0) or (hlen < slen):

return none

def get_move_list(string): # 根據最長字首與最長字尾判斷移動的位置

n = len(string)

temp_move_list = [0] # 只有乙個字元填充為0

j = 0

for i in range(1, n):

while j > 0 and string[i] != string[j]:

j = temp_move_list[j]

if string[i] == string[j]:

j += 1

return temp_move_list

move_list = get_move_list(substring)

j = 0

for i in range(hlen):

while hstring[i] != substring[j] and j > 0:

j = move_list[j - 1] # 匹配失敗,確定移動後的位置

if hstring[i] == substring[j]:

j += 1

if j == slen:

return i - slen + 1

return false

典型字串匹配演算法實現 單字串匹配演算法

部落格源址 相信大家對快捷鍵ctrl f是做什麼用的都應該很熟悉了,無論是文字編輯 網頁瀏覽等程式上它都意味著字串搜尋,我們提供乙個關鍵字,它將找到當前頁面上的所有該關鍵字所在的位置。關鍵字稱為模式串,在文字t中尋找模式串p出現的所有出現的位置,解決這種問題的演算法叫做字串匹配演算法。字串匹配演算法...

字串匹配演算法 字串匹配演算法總覽

字串匹配在文字處理裡非常重要,我們採用簡潔的python 把以下演算法一一實現並講解。樸素演算法 algorithm rabin karp 演算法 有限自動機演算法 finite automation knuth morris pratt 演算法 kmp algorithm boyer moore ...

字串匹配的python實現

所有字串匹配演算法的核心問題是,當出現不匹配時,如何向後移動模式串 一 暴力匹配演算法 如果要匹配乙個字串s 和乙個模式串p,則從i 0開始依次匹配s i i len p 簡單粗暴,如下 def matcher t,p param t the string to check param p patt...