一、最长公共子序列
两个序列中最长的公共子序列,子序列在两个序列中都是有序排列的。
string str1 = "abcaef";
string str2 = "abcdf";
string LCS = "abcf"; //最长公共子序列
二、动态规划解决LCS问题
int len1 = str1.size();
int len2 = str2.size();
假设 i=5 (abcaef), j=4 (abcdf). 最长公共子序列与
i=4 (abcae), j=3 (abcd)
i=5 (abcaef), j=3 (abcd)
i=4 (abcae), j=4 (abcdf)
有关。
if(str1[i] == str[j])
{
lcs[i][j] = lcs[i-1][j-1] + 1;
}
else
{
lcs[i][j] = max(lcs[i-1][j], lcs[i][j-1]);
}
三、二维数组记录状态
int dpLCS(string &str1,string &str2)
{
//记录数组
int **lcs = new int*[len1];
for(int i = 0; i < len1; i++)
{
lcs[i] = new int[len2];
}
menset(lcs,0,sizeof(lcs));
//dp
for(int i = 1; i < len1; i++)
{
for(int j = 1; j < len2; j++)
{
if(str1[i] == str[j])
{
lcs[i][j] = lcs[i-1][j-1] + 1;
}
else
{
lcs[i][j] = max(lcs[i-1][j], lcs[i][j-1]);
}
}
}
return lcs[i][j]; //长度
}