📅  最后修改于: 2023-12-03 15:37:14.012000             🧑  作者: Mango
该题目是印度空间研究组织(ISRO) 2008年计算机科学考试的一道问题。
给定两个字符串,计算它们的最长公共子序列长度。
例如,对于字符串“XMJYAUZ”和“MZJAWXU”,它们的最长公共子序列为“MJAU”,其长度为4。
这是一个经典的动态规划问题,可通过以下步骤来求解:
初始化一个 $m$ 行 $n$ 列的矩阵 $L$,其中 $m$ 和 $n$ 分别是两个字符串的长度。
遍历矩阵,对于每一个 $L_{i,j}$,如果 $i=0$ 或 $j=0$,则将其赋值为0,否则:
如果字符 $i$ 和字符 $j$ 相等,则 $L_{i,j}=L_{i-1,j-1}+1$;
如果字符 $i$ 和字符 $j$ 不相等,则 $L_{i,j}=\max(L_{i,j-1},L_{i-1,j})$。
最后,矩阵右下角的元素即为两个字符串的最长公共子序列长度。
可以根据矩阵还原出最长公共子序列。
下面是 Python 代码的实现:
def longest_common_subsequence(s1, s2):
m, n = len(s1), len(s2)
L = [[0] * (n+1) for _ in range(m+1)]
for i in range(1, m+1):
for j in range(1, n+1):
if s1[i-1] == s2[j-1]:
L[i][j] = L[i-1][j-1] + 1
else:
L[i][j] = max(L[i-1][j], L[i][j-1])
lcs = ""
i, j = m, n
while i > 0 and j > 0:
if s1[i-1] == s2[j-1]:
lcs = s1[i-1] + lcs
i -= 1
j -= 1
elif L[i-1][j] > L[i][j-1]:
i -= 1
else:
j -= 1
return L[m][n], lcs
其中,函数 longest_common_subsequence(s1, s2)
中,s1
和 s2
分别是两个字符串,它返回这两个字符串的最长公共子序列的长度和具体内容。