【intern】最长公共子串、编辑距离、KMP 等

这可能是一个很长的blog……

# 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最长的回文字符串 

(⬆️这个想法可以借鉴)

==================================================================================================================

编辑距离:

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"))

==================================================================================================================

KMP算法:

 

posted @ 2018-07-18 17:07  Sherry_Yang  阅读(399)  评论(0编辑  收藏  举报