最长公共子序列
最长公共子序列
https://leetcode-cn.com/problems/longest-common-subsequence/
子序列类型的问题,穷举出所有可能的结果都不容易,而动态规划算法做的就是穷举 + 剪枝,它俩天生一对儿。所以可以说只要涉及子序列问题,十有八九都需要动态规划来解决,往这方面考虑就对了。
带备忘录的递归
核心思想:如果两个字符串出现了一样的字符,那它必在 LCS 中。
用两个指针 i
和 j
从后往前遍历 s1 和 s2,如果 s1[i]==s2[j]
,那么这个字符一定在 LCS 中;否则的话,s1[i]
和 s2[j]
这两个字符至少有一个不在 LCS 中,需要丢弃一个,即其中一个指针往前移。至于是哪个,答案是都试一次,然后取最大的。
1 |
|
动态规划
字符串的 DP 表一般都是比字符串本身多出一位以表示处理完(空字符串)的情况,如图:
dp[i][j]
的含义是:对于 s1[1..i]
和 s2[1..j]
,它们的 LCS 长度是 dp[i][j]
。当 i 或 j 为 0 时,空串和任何字符串的 LCS 显然都是 0。
1 |
|