求LCS(最长公共子序列)长度并输出所有LCS——python实现

简介:LCS是Longest Common Subsequence的缩写,即最长公共子序列。它并不要求连续,且最长公共子序列不唯一。

例如:'ABCBDAB'  和  'BDCABA'的最长公共子序列有以下几个:
'ABCBDAB
'BDCABA'
lcs1:BCAB

'ABCBDAB'
'BDCABA'
lcs2:BCBA

'ABCBDAB'
'BDCABA'
lcs3:BDAB

获取最长公共子序列的长度

# -*- coding: utf-8 -*-
import numpy as np

def LCS(s1,s2):
    dp = np.zeros((len(s1)+1,len(s2)+1))  
    for i in range(1, len(s1)+1):
        for j in range(1, len(s2)+1):
            if s1[i-1]==s2[j-1]:
                dp[i][j]=dp[i-1][j-1]+1
            else:
                dp[i][j]=max(dp[i-1][j],dp[i][j-1])
    return dp[len(s1)][len(s2)]

if __name__ == '__main__':
    s1 = 'ABCBDAB'
    s2 = 'BDCABA'
    print(LCS(s1,s2))

 

输出所有最长公共子序列

# -*- coding: utf-8 -*-
import numpy as np

def LCS(s1,s2):
    dp = np.zeros((len(s1)+1,len(s2)+1))  
    for i in range(1, len(s1)+1):
        for j in range(1, len(s2)+1):
            if s1[i-1]==s2[j-1]:
                dp[i][j]=dp[i-1][j-1]+1
            else:
                dp[i][j]=max(dp[i-1][j],dp[i][j-1])
    return dp

def GetLCS(i,j,dp,s1,s2,s):
    while i>0 and j>0:
        if s1[i-1]==s2[j-1]:
            s+=s1[i-1]
            i-=1
            j-=1
        else:
            if dp[i-1][j]>dp[i][j-1]:
                i-=1
            elif dp[i-1][j]

 

你可能感兴趣的:(Hadoop学习)