问题:若给定序列X={1,5,2,8,9,3,6},Y={5,6,8,9,3,7},则序列X和Y的公共子序列为?
#LongestCommonSubsequence
# 若给定序列X={1,5,2,8,9,3,6},Y={5,6,8,9,3,7},则序列X和Y的公共子序列为?
import numpy as np
X={1,5,2,8,9,3,6}
Y={5,6,8,9,3,7}
print(X)
print(Y)
print("=====================")
ListX1=list(X)
ListY1=list(Y)
print(ListX1)
print(ListY1)
AllZeroMatrix = np.full((len(X), len(Y)), 0) # 全零矩阵 (n行,n列 ,填充数)
print(AllZeroMatrix)
def NumberForlongestCommonSubsequence(X,Y,AllZeroMatrix):
Lower=min(len(X),len(Y))
print("更小值:",Lower)
for i in range(1,len(X)):
for j in range(1,Lower):
print("此时的i:{},此时的j:{}".format(i,j))
print("此时的ListX1[i-1]:",ListX1[i-1])
print("此时的ListY1[j-1]:",ListY1[j-1])
if ListX1[i-1]==ListY1[j-1]:
AllZeroMatrix[i][j]=AllZeroMatrix[i-1][j-1]+1 #有检测到相等就加1
print("************加1*************")
print("此时的矩阵:\n")
print(AllZeroMatrix)
else:
print("此时的AllZeroMatrix[i - 1][j]:",AllZeroMatrix[i - 1][j])
print("此时的AllZeroMatrix[i][j - 1]:",AllZeroMatrix[i][j - 1])
AllZeroMatrix[i][j] = max(AllZeroMatrix[i - 1][j], AllZeroMatrix[i][j - 1])
#没有检测到相等就 此时的AllZeroMatrix[i - 1][j]与此时的AllZeroMatrix[i][j - 1]两个位置的数比较大小
#谁大就在矩阵里往AllZeroMatrix[i][j]的位置赋谁
print("此时的AllZeroMatrix:\n")
print(AllZeroMatrix)
ListX2=[1,5,2,8,9,3,6]
ListY2=[5,6,8,9,3,7]
Result = ""
for f in ListX2:
if ListX2.count(f)>1:
ListX2.remove(f)
print("ListX2为:",ListX2)
for f in range(len(ListX2)-1):
for g in range(len(ListY2)-1):
if (ListX2[f] == ListY2[g]):
Result += str(ListX2[f])
print(ListX2[f],end=" ")
print("Result:",Result)
print("\n\n\n\n 最长公共子序列为:",Result)
print("\n 矩阵表为:\n")
print(AllZeroMatrix)
return AllZeroMatrix[i][j]
print("\n 故最长公共子序列长度为:",NumberForlongestCommonSubsequence(X,Y,AllZeroMatrix))