问题描述
给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。
一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。
例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。
若这两个字符串没有公共子序列,则返回 0。
动态规划解法
非常经典的dp题目,递推方程为:
if s1[i] == s2[j] :
dp[i][j] = dp[i-1][j-1] + 1
else
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
空间优化
如图,因为答案来源为 dp[i-1][j-1], dp[i-1][j], dp[i][j-1]
,所以只用保存上一行的值即可,这和背包问题的空间优化类似
用一行dp数组即可,因为递推式,所以i,j
递增更新,而每次更新时,dp[j]
代表二维dp数组的dp[i-j][j]
,即上方格子,dp[j-1]
代表二维dp数组的dp[i][j-1]
,即左边