📅  最后修改于: 2023-12-03 15:26:28.283000             🧑  作者: Mango
最长公共子序列(Longest Common Subsequence, LCS)是一类常见的字符串匹配问题,指的是找出两个或多个字符串中最长的公共子序列。
在C++中,我们可以使用动态规划来求解最长公共子序列。下面是一个C++程序,演示了如何使用动态规划求解最长公共子序列。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
// 求解最长公共子序列
int lcs(string s1, string s2)
{
int len1 = s1.length();
int len2 = s2.length();
int dp[len1+1][len2+1];
// 初始化动态规划表
for(int i=0; i<=len1; i++)
{
for(int j=0; j<=len2; j++)
{
dp[i][j] = 0;
}
}
// 填充动态规划表
for(int i=1; i<=len1; i++)
{
for(int j=1; j<=len2; j++)
{
if(s1[i-1] == s2[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[len1][len2];
}
int main()
{
string s1 = "abcd";
string s2 = "bcda";
cout<<"最长公共子序列的长度为: "<<lcs(s1,s2);
return 0;
}
本程序中,lcs
函数用于求解两个字符串str1
和str2
的最长公共子序列的长度。其中,动态规划表dp
用于存储以s1[i-1]
和s2[j-1]
为结尾的最长公共子序列的长度。
动态规划表dp
的初始化为dp[i][j]=0
,其中0<=i<=len1
,0<=j<=len2
。当s1[i-1] == s2[j-1]
时,说明此时s1[i-1]
和s2[j-1]
属于最长公共子序列的一部分,因此可以通过s1[0:i-1]
和s2[0:j-1]
推导出s1[0:i]
和s2[0:j]
的最长公共子序列,即dp[i][j] = dp[i-1][j-1] + 1
;当s1[i-1] != s2[j-1]
时,说明此时s1[i-1]
和s2[j-1]
不属于最长公共子序列的一部分,因此需要选取s1[0:i-1]
和s2[0:j]
以及s1[0:i]
和s2[0:j-1]
两者的最长公共子序列中的最大值,即dp[i][j] = max(dp[i-1][j], dp[i][j-1])
。
最终,函数返回动态规划表dp
的最后一个元素dp[len1][len2]
,即为最长公共子序列的长度。
在程序中,我们以字符串"abcd"
和"bcda"
为例,通过调用lcs
函数计算出了它们之间的最长公共子序列长度为3
,即为字符串"bcd"
。
最长公共子序列是一个经典的求解字符串匹配问题,它的动态规划解法可以有效地解决此类问题。本文中,我们通过C++代码实现了最长公共子序列的求解过程,对于C++中使用动态规划求解问题的程序员来说,这无疑是一份十分有用的参考资料。