动态规划 最长公共子序列LCS
这是我在看动态规划学习的时候做的。
这是一篇LCS。LCS是两个数组进行比较。
?我觉得这个总结挺好的:
求两个数组或者字符串的最长公共子序列问题,肯定是要用动态规划的。
首先,区分两个概念:子序列可以是不连续的;子数组(子字符串)需要是连续的;
另外,动态规划也是有套路的:单个数组或者字符串要用动态规划时,可以把动态规划 dp[i] 定义为 nums[0:i] 中想要求的结果;当两个数组或者字符串要用动态规划时,可以把动态规划定义成两维的?dp[i][j]
?,其含义是在?A[0:i]
?与?B[0:j]
?之间匹配得到的想要的结果。
状态:dp[i][j]:
第一个串的前i位和第二个串的前j位中的最长公共子序列
转移方程:
时间复杂度:O(nm)
空间复杂度:O(nm)
#include <string>
#include <vector>
#include <iostream>
//动态规划
// 最长公共子序列
//时间复杂度:O(n×m)
//空间复杂度:O(n×m)
class Solution {
public:
int longestCommonSubsequence(std::string text1, std::string text2) {
std::vector<std::vector<int>> dp(text1.size(), std::vector<int>(text2.size(), 0));
for (int i = 0; i < text1.size(); ++i)
{
for (int j = 0; j < text2.size(); ++j)
{
if (text1[i] == text2[j])
dp[i][j] = (i > 0 && j > 0) ? dp[i - 1][j - 1] + 1 : 1;
else
{
int a_tmp = i > 0 ? dp[i - 1][j] : 0;
int b_tmp = j > 0 ? dp[i][j - 1] : 0;
dp[i][j] = std::max(a_tmp, b_tmp);
}
}
}
return dp[text1.size() - 1][text2.size() - 1];
}
};
void Test_solution1()
{
std::string text1{ "abceda" };
std::string text2{ "acea" };
Solution solution;
std::cout<<solution.longestCommonSubsequence(text1, text2);
}