最长公共子序列(动态规划基础)

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值