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算法:

  • 相关阅读:
    MKMapVIew学习系列2 在地图上绘制出你运行的轨迹
    WPF SDK研究 Intro(6) WordGame1
    WPF SDK研究 Intro(3) QuickStart3
    WPF SDK研究 Layout(1) Grid
    WPF SDK研究 目录 前言
    WPF SDK研究 Intro(7) WordGame2
    WPF SDK研究 Layout(2) GridComplex
    对vs2005创建的WPF模板分析
    WPF SDK研究 Intro(4) QuickStart4
    《Programming WPF》翻译 第6章 资源
  • 原文地址:https://www.cnblogs.com/sherry-yang/p/9330342.html
Copyright © 2011-2022 走看看