1 题目描述
2 解题思路
我们可以用动态规划解决这个问题。
假设我们用坐标i表示当前遍历到的text1的坐标,j表示当前遍历到的text2的坐标。ret[i][j]表示text1遍历到i,text2遍历到j的时候的最长公共子序列长度。
那么对每一对(i,j),ret[i][j]满足:
·如果text1[i]=text2[j],那么ret[i][j]是ret[i][j-1](text1的i坐标和text2的j-1坐标匹配)、ret[i-1][j](text1的i-1坐标和text2的j坐标匹配)、ret[i-1][j-1]+1(text1的i-1坐标和text2的j-1坐标匹配)中最大的一个。
·如果text1[i]≠text2[j],那么ret[i][j]是ret[i][j-1](text1的i坐标和text2的j-1坐标匹配)、ret[i-1][j](text1的i-1坐标和text2的j坐标匹配)、ret[i-1][j-1](text1的i-1坐标和text2的j-1坐标匹配)中最大的一个。
class Solution:
def longestCommonSubsequence(self, text1: str, text2: str) -> int:
ret=[]
for i in range(len(text1)+1):
ret.append([0]*(len(text2)+1))
for i in range(1,len(text1)+1):
for j in range(1,len(text2)+1):
ret[i][j]=max(ret[i][j-1],
ret[i-1][j],
ret[i-1][j-1]+(text1[i-1]==text2[j-1]))
return(max(max(ret)))