【intern】最長公共子串、編輯距離、KMP 等

這多是一個很長的blog……python

# from https://blog.csdn.net/justheretobe/article/details/51764587
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def lcs(s1,s2):
    m = len(s1)
    n = len(s2)
    counter = [[0]*(n+1) for x in range(m+1)]
    longest = 0
    lcs_set = set()
    for i in range(1,m+1):
        for j in range(1,n+1):
            if s1[i-1] == s2[j-1]:
                c = counter[i-1][j-1] + 1
                counter[i][j] = c
                if c > longest:
                    lcs_set = set()
                    longest = c
                    lcs_set.add(s1[i-c:i])
                elif c == longest:
                    lcs_set.add(s1[i-c:i])
    return lcs_set


if __name__ == "__main__":
    assert lcs('academy', 'abracadabra') == {'acad'}
    assert lcs('ababc', 'abcdaba') == {'aba','abc'}
    assert lcs('abcdefgh', 'cdefgh') == {'cdefgh'}
    assert lcs('abcdefgh', '') == set()
    print('assert complete!')

若是不須要存全部的最長公共子串結果,能夠把lcs_set變爲字符串。算法

獲取string中的最長迴文字符串還可使用尋找兩個字符串最長公共substring的方法解答: 
1. s1=‘給定字符串’ 
2. s2=‘給定字符串的反序’ 
3. 比較s1與s2, 獲取兩個字符串中最長的公共字符串,即爲s1最長的迴文字符串 spa

(⬆️這個想法能夠借鑑).net

==================================================================================================================code

編輯距離:orm

def normal_leven(str1, str2):
    len_str1 = len(str1) + 1
    len_str2 = len(str2) + 1
    # 建立矩陣
    matrix = [0 for n in range(len_str1 * len_str2)]
    # 矩陣的第一行
    for i in range(len_str1):
        matrix[i] = i
    print(matrix)
    # 矩陣的第一列
    for j in range(0, len(matrix), len_str1):
        if j % len_str1 == 0:
            matrix[j] = j // len_str1
    # 根據狀態轉移方程逐步獲得編輯距離
    for i in range(1, len_str1):
        for j in range(1, len_str2):
            if str1[i - 1] == str2[j - 1]:
                cost = 0
            else:
                cost = 1
            matrix[j * len_str1 + i] = min(matrix[(j - 1) * len_str1 + i] + 1,
                                           matrix[j * len_str1 + (i - 1)] + 1,
                                           matrix[(j - 1) * len_str1 + (i - 1)] + cost)

    return matrix[-1]  # 返回矩陣的最後一個值,也就是編輯距離

print(normal_leven("ert","etn"))

==================================================================================================================blog

KMP算法:utf-8

相關文章
相關標籤/搜索