https://blog.youkuaiyun.com/lz161530245/article/details/76943991
https://blog.youkuaiyun.com/qq_31881469/article/details/77892324
https://blog.youkuaiyun.com/hrn1216/article/details/51534607
个人代码:
#include <iostream>
#include <string>
using namespace std;
int lcslength(string str1,string str2, int **b) //求最长公共子序列的长度
{
int len1=str1.length();
int len2=str2.length();
//双指针的方法申请动态二维数
int **c = new int*[len1+1]; //共有length1+1行
for(int i = 0; i < len1+1; i++)
c[i] = new int[len2+1];//共有length2+1列
for (int i=0;i<=len1;i++)
{
for (int j=0;j<=len2;j++)
{
if (i==0 ||j==0) c[i][j]=0;
else if (str1[i-1]==str2[j-1]) //由于c[][]的0行0列没有使用,c[][]的第i行元素对应str1的第i-1个元素
{
c[i][j]=c[i-1][j-1]+1;
b[i][j]=0;
}
else if (c[i-1][j]>c[i][j-1])
{
c[i][j]=c[i-1][j];
b[i][j]=1;
}
else
{
c[i][j]=c[i][j-1];
b[i][j]=-1;
}
}
}
int len=c[len1][len2];
for(int i = 0; i < len1+1; i++) delete[] c[i]; //释放动态申请的二维数组
delete[] c;
return len;
}
void printlcs(int **b,string str1,int i, int j) //求最长公共子序列
{
if (i==0 ||j==0) return;
if (b[i][j]==0)
{
printlcs(b,str1,i-1,j-1); //从后面开始递归,所以要先递归到子串的前面,然后从前往后开始输出子串
printf("%c",str1[i-1]); //c[][]的第i行元素对应str1的第i-1个元素
}
else if (b[i][j]==1)
{
printlcs(b,str1,i-1,j);
}
else printlcs(b,str1,i,j-1);
}
int main()
{
string str1,str2;
int i,len1,len2,len;
printf("请输入第一个字符串:");
cin>>str1;
printf("请输入第二个字符串:");
cin>>str2;
len1=str1.length();
len2=str2.length();
int **b=new int *[len1+1];
for (i=0;i<len1+1;i++)
b[i]=new int[len2+1];
len=lcslength(str1,str2,b);
printf("最长公共子序列的长度为:%d\n",len);
printf("最长公共子序列为:");
printlcs(b,str1,len1,len2);
for(i = 0; i < len1+1; i++)//释放动态申请的二维数组
delete[] b[i];
delete[] b;
return 0;
}