包含: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
temp_move_list.append(j)
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