力扣刷题---1143. 最长公共子序列

1143. 最长公共子序列

在这里插入图片描述

解题思路

先谈谈最基本的二维的做法

状态转移方程:

当(s1[i]==s2[j])//这里不需要取最大值是因为这个值就已经是当前可取到的最大值了
dp[i][j]=dp[i-1][j-1]+1

当(s1[i]!=s2[j])//一个i-1,一个j-1,意思就是得到当前取到的s1和s2的两个子串的公共子序列长度的最大值,算是得到小状态的最优解了
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);

然后再谈谈这里可以用到的滚动数组

我们可以发现 在二维数组的使用中,实际上只有某一行和他的上一行进行了数据的互动,所以可以省略掉数组的一个维度,而使用一个在反复迭代的一维数组
这里对于两字符比较为不相同时的dp[i-1][j]和dp[i][j-1],仔细想想就会知道完全直接抛掉一维是没有问题的
但是对于比较为相同时,这时用到了左上角的数据,这时采取迭代存储这个数据就行了

代码

class Solution {
    public int longestCommonSubsequence(String text1, String text2) {
        int[] dp = new int[text2.length()+1];
        int len1=text1.length(),len2=text2.length();
        for(int i=1;i<=len1;i++){
            int lr=dp[0];
            for(int j=1;j<=len2;j++){
                int temp=dp[j];
                if(text1.charAt(i-1)==text2.charAt(j-1)){
                    dp[j]=lr+1;
                }else{
                    dp[j]=Math.max(dp[j-1],dp[j]);
                }
                lr=temp;
            }
        }
        return dp[text2.length()];
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值