一、题目描述
给定两个字符串s和t,返回这两个字符串的最长公共子序列的长度。
- 若两个字符串没有公共子序列,则返回0。
- 一个字符串的子序列是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符后组成的新字符串。例如“ace”是“abcde”的子序列。
二、定义状态方程
dp[i][j]含义:s[0…i)和t[0…j)的最长公共子序列长度。
注:dp[i][j]也可以定义为s[0…i]和t[0…j]的最长公共子序列长度,两种定义方式边界值的处理方式不同。
三、状态转移方程
- 只看一步,dp[i][j]的上一步状态可能是:dp[i-1][j]、dp[i][j-1]、dp[i-1][j-1]。
- 看dp[i][j]与dp[i-1,j]、dp[i,j-1]、dp[i-1,j-1]的关系。
- 当s[i-1]==t[j-1]:
dp[i][j]的上一步状态 :
dp[i][j]=max{dp[i-1][j],dp[i][j-1],dp[i-1][j-1]+1}
- 当s[i-1]!=t[j-1]
dp[i][j]=max{dp[i-1][j],dp[i][j-1]}
---------------------------------
为什么这种情况下,dp[i][j]的上一步状态没有dp[i-1][j-1]?
因为当s[i-1]!=t[j-1],dp[i][j]=max{dp[i-1][j],dp[i][j-1],dp[i-1][j-1]}
dp[i-1][j-1]<= min{dp[i-1][j],