最长公共子序列
最长公共子序列
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  |  |