利用递归算法求解两个字符串的最大公共子序列的长度问题C++
时间: 2024-09-25 20:10:19 浏览: 40
求两个字符串的最长公共子序列.pdf
在C++中,可以利用动态规划结合递归的思想来解决最大公共子序列(Longest Common Subsequence,LCS)问题。经典的斐波那契编码法或者二维数组dp(Dynamic Programming)方法能够有效地计算这个问题。
下面是基本的递归+记忆化(Memoization)版本的代码:
```cpp
#include <string>
using namespace std;
int lcs(string str1, string str2) {
int m = str1.length();
int n = str2.length();
// 创建一个二维数组来存储已计算的最长公共子序列长度
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
// 递归地填充dp数组
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (str1[i - 1][j - 1] + 1;
} else { // 否则取两者之前的最大值
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
return dp[m][n]; // 返回最终的结果即为最长公共子序列的长度
}
// 示例
int main() {
string str1 = "ABCDGH";
string str2 = "AEDFHR";
cout << "Length of LCS is: " << lcs(str1, str2) << endl;
return 0;
}
```
在这个代码里,`lcs`函数首先初始化一个dp数组,然后通过嵌套循环遍历两个输入字符串。如果当前字符匹配,则在对应位置的dp值加一;如果不匹配,则取左上角和左下角的dp值中的较大者。最后返回dp数组右下角的值作为结果。
阅读全文