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

包含: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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章