最长公共字序列 动态规划 空间复杂度o(min{n,m})带打印

本文介绍了如何使用动态规划解决最长公共子序列问题,通过优化空间复杂度从O(nm)降至O(min{n,m})。讨论了递推公式并提供了相应的代码实现。" 114488676,10538582,C语言存储二进制数据到MySQL Blob字段,"['数据库编程', 'C/C++', 'MySQL']
摘要由CSDN通过智能技术生成

这是典型的动态规划,两个字符串 str1=a1,a2……,an, str2=b1,b2,……,bm;

如果用dp[i][j]表示str1的前 i 个字符 和str2的前 j 个字符的最大公共子序列的长度,那么dp[n][m]就是要求的结果,但这种方法的空间复杂度是o(nm),但其实每次要用到的只是上一行的结果,所以空间复杂度可以优化为 o(min{n,m}).

这里设 vecOrignal 为上一行的结果,初始化为全零,vec 为当前行的结果,

那么比较str1 的前 i 个字符和 str2 的前 j 个字符时, 我们知道递推公式为

若 str1[ i ] = str2[ j ] ,

vec[ j ] = vecOrignal [j-1] + 1;  如果当前的两个字符相等的话,那么两个字符串都向前移动一位,结果加1, 此时再比较 str1的前 i-1个字符和 str2 的前 j-1个字符


否则, vec[j] = max{ vec[ j-1 ], vecOrignal [j] }; 

vec[j-1]相当于 str2 前移动一位,此时再比较 str1的前 i 个字符和 str2 的前 j-1个字符

vecOrignal[ j ] 相当于str1 前移动一位,此时再比较 str1的前 i-1 个字符和 str2 的前 j 个字符

 dist[i][j] 用来记录 比较 str[ i ] 和 str2[ j ] 时来自哪两个字符比较的结果,为 1 代表 str[ i ] 和 str2[ j ] 相等,记录此字符,

为 2 表示 来自

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值