這多是一個很長的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