200224题(最长公共子序列)

在这里插入图片描述
思路:二维dp
定义一个二维数组 dp 用来存储最长公共子序列的长度,其中 dp[i][j] 表示 S1 的前 i 个字符与 S2 的前 j 个字符最长公共子序列的长度。考虑 S1i 与 S2j 值是否相等,分为两种情况:

当 S1i==S2j 时,那么就能在 S1 的前 i-1 个字符与 S2 的前 j-1 个字符最长公共子序列的基础上再加上 S1i 这个值,最长公共子序列长度加 1,即 dp[i][j] = dp[i-1][j-1] + 1。
当 S1i != S2j 时,此时最长公共子序列为 S1 的前 i-1 个字符和 S2 的前 j 个字符最长公共子序列,或者 S1 的前 i 个字符和 S2 的前 j-1 个字符最长公共子序列,取它们的最大者,即 dp[i][j] = max{ dp[i-1][j], dp[i][j-1] }。
综上,最长公共子序列的状态转移方程为:
在这里插入图片描述
代码很简单:

//dp[i][j]表示S1的前i个字符与S2的前j个字符最长公共子序列的长度。
class Solution {
public:
	int longestCommonSubsequence(string text1, string text2) {
		vector<vector<int>>dp(text1.size() + 1, vector<int>(text2.size() + 1, 0));
		for (int i = 1; i <= text1.size(); i++)
			for (int j = 1; j <= text2.size(); j++)
			{
				if (text1[i - 1] == text2[j - 1])
				{
					dp[i][j] = dp[i - 1][j - 1] + 1;
				}
				else
				{
					dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
				}
			}
		return dp[text1.size()][text2.size()];
	}
};
发布了212 篇原创文章 · 获赞 4 · 访问量 8819

猜你喜欢

转载自blog.csdn.net/ShenHang_/article/details/104383726