1143.最长公共子序列
1143.最长公共子序列
给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。
一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。
- 例如,"ace"是"abcde"的子序列,但"aec"不是"abcde"的子序列。
两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。
示例 1:
| 1 | 输入:text1 = "abcde", text2 = "ace" | 
示例 2:
| 1 | 输入:text1 = "abc", text2 = "abc" | 
线性dp
子序列问题本质就是选or不选,考虑最后一对字母,分别叫x和y,那么有4种情况
- 不选x不选y
- 不选x选y
- 选x不选y
- 选x选y
可以直接写出回溯表达式
那么有2个问题需要关注:
- 在s[i]=t[j]时,真的需要dfs(i-1,j)和dfs(i,j-1)吗?
- 在s[i]!=t[j]时,需要dfs(i-1,j-1)吗?
这两个问题的答案都是否定的,在s[i]=t[j]时,只需要直接dfs(i-1,j-1)即可,可以从数学角度证明,dfs(i-1,j)和dfs(i,j-1)的结果都不如dfs(i,j)
而s[i]!=t[j],不需要dfs(i-1,j-1),因为dfs(i,j-1)和dfs(i-1,j)会递归到dfs(i-1,j-1)
很自然的写出dp代码
| 1 | class Solution { | 
用二维数组是因为上一行的状态会被下一行所覆盖掉,如果用临时变量存储上一个状态即可
| 1 | class Solution { | 


