最长公共子序列
Description
给定两个字符串,返回两个字符串的最长公共子序列(不是最长公共子字符串),可能是多个。
Input
输入第一行为用例个数, 每个测试用例输入为两行,一行一个字符串
Output
如果没有公共子序列,不输出,如果有多个则分为多行,按字典序排序。
Sample Input 1
1
1A2BD3G4H56JK
23EFG4I5J6K7
Sample Output 1
23G456K
23G45JK
思路
dp矩阵构建的具体过程见函数getdp()。
由于本题要求输出全部的最长公共子序列,因此上面第5点需做修改:如果dp[i][j]同时等于dp[i-1][j]和dp[i][j-1],则进行递归处理,分别在向上和向下进行递归,最终向上和向下取得的最长公共子序列均能获得。
python3
# 最长公共子序列:给定两个字符串,返回两个字符串的最长公共子序列(不是最长公共子字符串),可能是多个。
# 生成矩阵dp,dp最右下角的值代表最长公共子序列的长度
def getdp(str1, str2):
dp = [[0] * len(str2) for x in range(len(str1))]
dp[0][0] = 1 if str1[0] == str2[0] else 0
for i in range(1, len(str1)):
dp