动态规划之三——线性DP入门2
3.1 最长公共子序列(LCS)
3.1.1、问题引入
问题描述:给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列(Longest Common Subsequence)的长度
示例:
输入:text1 = "ABCBDAB", text2 = "BDCAB"
输出:4
解释:最长公共子序列是 "BCAB" 或 "BDAB"
备注
你先想想,如果用暴力递归,你会怎么做?
3.1.2 暴力递 归
暴力递归参考
int lcs(string& text1, string& text2, int i, int j) {
// 基准条件:任意字符串处理完毕
if (i == 0 || j == 0) return 0;
// 情况1:末尾字符匹配
if (text1[i-1] == text2[j-1]) {
return lcs(text1, text2, i-1, j-1) + 1;
}
// 情况2:末尾字符不 匹配
else {
return max(
lcs(text1, text2, i-1, j), // 舍弃text1的末尾字符
lcs(text1, text2, i, j-1) // 舍弃text2的末尾字符
);
}
}
暴力递归的问题
-
重复计算:大量子 问题被重复计算
// 示例:计算lcs(2,2)会被多次调用
lcs(3,3) -> lcs(2,3) -> lcs(2,2)
lcs(3,3) -> lcs(3,2) -> lcs(2,2) -