zoukankan      html  css  js  c++  java
  • 【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算法:

  • 相关阅读:
    C#6.0新语法
    C#泛型详解
    C#下Hashtable和Dictionary之间的差别
    C#中HashTable的用法
    MySQL日志
    MySQL创建数据表并建立主外键关系
    MySQL函数的使用
    MySQL实现SQL Server排名函数
    Windows安装SVN服务器和客户端
    Oracle SQL Developer 免费的DB2客户端
  • 原文地址:https://www.cnblogs.com/sherry-yang/p/9330342.html
Copyright © 2011-2022 走看看