java实现最长连续子序列_动态规划5:两个字符串的最长公共子序列

字符串a,长度为m:a[1].a[2].a[3].a[4]....a[m]

字符串b,长度为n:b[1].b[2].b[3].b[4]....b[n]

比如字符串a:BDCABA;字符串b:ABCBDAB,字符串a、b的最长公共子序列长度为4,最长公共子序列是:BCBA或者BDAB,子序列可以不用连续

1.求字符串a(0~m)和b(0~n)的最长公共子序列:如果a[m]等于b[n],问题是不是转化为求a(0~m-1)和b(0~n-1)的最长公共子序列(再加上a[m]或者b[n]的这个字符),最长公共子序列的长度用dp[m-1][n-1]+1表示;同样的,如果a[m-1]等于b[n-1],问题转化为求a(0~m-2)和b(0~n-2)的最长公共子序列+2,用dp[m-2][n-2]+2表示;

2.如果a[m]不等于b[n],说明最后一个元素不可能是最长公共子序列中的元素(最后一个字符都不相等了,所以就不可能公共了),那对于最长公共子序列来说,可能是a[m-1]和b[n]的最长公共子序列或者a[m]和b[n-1]的最长公共子序列;同理要判断a[m-1]和b[n],如果a[m-1]和b[n]不相等,那继续递推a[m-1]、b[n-1]和a[m-2]、b[n];a[m]和b[n-1]是不是相等,如果a[m]和b[n-1]不相等,那继续递推a[m-1]、b[n-1]和a[m]、b[n-2];

.......

3.如果m=0,也即字符串a的长度是0,不管字符串b的情况怎样,那最长公共子序列肯定是0,记d[0][n]=0;同理,b字符串的长度为0时,d[m][0]=0;

即 if(a[m]==b[n]) dp[m][n] = dp[m-1][n-1]+1;

if(a[m]!=b[n]) dp[m][n] = max{dp[m-1][n], dp[m][n-1]};

if(m==0||n==0) dp[m][n]=0;

4.构建二维数组,dp[m][n]的值就是要求的最长公共子序列长度,如下图中的dp[6][7]=4

e5acb249b70ed1881d20c12016175d5d.png

5.同样,根据上图,找到最长公共子序列BCBA或者BDAB

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值