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 { |