Skip to content

20650: 最长的公共子序列的长度

http://cs101.openjudge.cn/practice/20650/

我们称一个字符的数组S为一个序列。对于另外一个字符数组Z,如果满足以下条件,则称Z是S的一个子序列:(1)Z中的每个元素都是S中的元素(2)Z中元素的顺序与在S中的顺序一致。例如:当S = (E,R,C,D,F,A,K)时,(E,C,F)和(E,R)等等都是它的子序列。而(R,E)则不是。

现在我们给定两个序列,求它们最长的公共子序列的长度。

输入

一共两行,分别输入两个序列。

输出

一行,输出最长公共子序列的长度。

样例输入

ABCBDAB

BDCABA

样例输出

4
python
def longest_common_subsequence(s1, s2):
    dp = [[0 for _ in range(len(s2)+1)] for _ in range(len(s1)+1)]
    for i in range(len(s1)):
        for j in range(len(s2)):
            if s1[i] == s2[j]:
                dp[i+1][j+1] = dp[i][j] + 1
            else:
                dp[i+1][j+1] = max(dp[i+1][j], dp[i][j+1])
    return dp[len(s1)][len(s2)]

s1 = input()
s2 = input()
print(longest_common_subsequence(s1, s2))