注:动态规划1035.不相交的线与这题思路和方法是一样的,换了种描述方法。
思路分析:
- 创建一个二维向量
dp
,其中dp[i][j]
表示text1
的前i
个字符和text2
的前j
个字符的最长公共子序列长度。 - 使用两个嵌套循环遍历
text1
和text2
的所有字符。 - 如果当前字符相等,则当前最长公共子序列长度为前一个状态加1,即
dp[i][j] = dp[i - 1][j - 1] + 1
。 - 如果当前字符不相等,则取
text1
的前一个字符和text2
当前字符的最长公共子序列长度以及text1
当前字符和text2
的前一个字符的最长公共子序列长度的较大值,即dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
。 - 最终,返回
dp[text1.size()][text2.size()]
,即text1
和text2
的最长公共子序列的长度。
class Solution {
public:
// 计算两个字符串的最长公共子序列长度
int longestCommonSubsequence(string text1, string text2) {
// 创建一个二维向量dp,其中dp[i][j]表示text1的前i个字符和text2的前j个字符的最长公共子序列长度
vector<vector<int>> dp(text1.size() + 1, vector<int>(text2.size() + 1, 0));
// 使用两个嵌套循环遍历text1和text2的所有字符
for (int i = 1; i <= text1.size(); i++) {
for (int j = 1; j <= text2.size(); j++) {
// 如果当前字符相等,则当前最长公共子序列长度为前一个状态加1
if (text1[i - 1] == text2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
// 如果当前字符不相等,则取text1的前一个字符和text2当前字符的最长公共子序列长度
// 以及text1当前字符和text2的前一个字符的最长公共子序列长度的较大值
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
// 返回text1和text2的最长公共子序列的长度
return dp[text1.size()][text2.size()];
}
};