leetcode1143. 最长公共子序列-动态规划(java)

这篇具有很好参考价值的文章主要介绍了leetcode1143. 最长公共子序列-动态规划(java)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

leetcode1143. 最长公共子序列

leetcode1143. 最长公共子序列
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-common-subsequence

题目描述

给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。
一个字符串的 子序列 是指这样一个新的字符串:
它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。
例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。
两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。

示例 1:
输入:text1 = “abcde”, text2 = “ace”
输出:3
解释:最长公共子序列是 “ace” ,它的长度为 3 。

示例 2:
输入:text1 = “abc”, text2 = “abc”
输出:3
解释:最长公共子序列是 “abc” ,它的长度为 3 。

示例 3:
输入:text1 = “abc”, text2 = “def”
输出:0
解释:两个字符串没有公共子序列,返回 0 。

提示:
1 <= text1.length, text2.length <= 1000
text1 和 text2 仅由小写英文字符组成。

暴力递归

解题思路

我们用指针法:
一.先把两个字符串转成两个字节数组
二.两个指针分别卡住字符数组的最右边
三.通过比较不断移动指针位置,遇到相等的就加1,不等的就不加
以上是整体思路:
具体细节.
先考虑base case .只有指针走到了头,才会停止
所以base case 就是0 位置,
知道了0位置,还要考虑哪个数组在0位置.要分开判断
然后就是普遍位置了.就是递归的过程了.
流程清楚了,代码就好写了

代码演示

    public int longestCommonSubsequence(String text1, String text2) {
        if (text1 ==null || text2 == null || text2.length() == 0 || text1.length() == 0){
            return 0;
        }
        return process(text1.toCharArray(),text2.toCharArray(),text1.length() - 1,text2.length() - 1);
    }

    /**
     *
     * @param str1 字节数组
     * @param str2 字节数组
     * @param i 字节数组str1 的下标
     * @param j 字节数组str2 的下标
     * @return
     */
    public static int process(char[]str1,char[]str2,int i,int j ){
        //base case 都在0 位置
        if(i == 0 && j == 0){
            return str1[i] == str2[j] ? 1 : 0;
        }else if (i == 0){
            //i 来到 0 位置 相等直接返回1 不等还要继续移动str2 的指针就行比较有没有相同的
            if(str1[i] == str2[j]){
                return 1;
            }else{
                return process(str1,str2,i,j - 1);
            }
        } else if (j == 0) {
            //j来到 0 位置 相等直接返回1 不等还要继续移动str1 的指针就行比较有没有相同的
            if(str1[i] == str2[j]){
                return 1;
            }else{
                return process(str1,str2,i - 1,j);
            }

        }else {
            int p1 = 0;
            int p2 = 0;
            int p3 = 0;
            if(str1[i] != str2[j]){
            	//不等时 str1 的指针和 str2 的指针 分两种情况
            	//分别进行比较
                p1 = process(str1,str2,i,j - 1);
                p2 = process(str1,str2,i - 1,j );
            }else{
            	//相等时 同时移动 子序列加1 
                p3 = 1 +   process(str1,str2,i - 1,j - 1);     
            }
            return Math.max(p1,Math.max(p2,p3));
        }
    }

动态规划

解题思路

动态规划就是对递归的改写,把递归过程,变成动态规划表生成的过程.
改写的三个步骤:
一.通过base case 先初始化能确定的值
二.通过递归过程去初始化剩余的值
三,返回递归调用的最初始状态.

代码演示

    /**
     * 动态规划
     * @param text1
     * @param text2
     * @return
     */
 public static int dp(String text1, String text2){
        char[] str1 = text1.toCharArray();
        char[] str2 = text2.toCharArray();
        int N = str1.length;
        int M = str2.length;
        int[][]dp = new int[N][M];
        //根据base case 初始化
        dp[0][0] = str1[0] == str2[0] ? 1 : 0;
        //str1 来到 0 位置时
        for (int j = 1; j < M ;j++){
            dp[0][j] = str1[0] == str2[j] ? 1 : dp[0][j - 1];
        }
        //str2 来到 0 位置时
        for (int i = 1;i < N ;i++){
            dp[i][0] = str1[i] == str2[0] ? 1 : dp[i - 1][0];
        }
        for (int i = 1;i < N ;i++){
            for (int j = 1;j < M ;j++){
               
            int p1 = 0;
            int p2 = 0;
            int p3 = 0;
            if(str1[i] != str2[j]){
                p1 = dp[i][j - 1];
                p2 = dp[i - 1][j];
            }else{
                p3 = 1 + dp[i -1][j - 1];     
            }

                dp[i][j] =  Math.max(p1,Math.max(p2,p3));
            }
        }
        //返回递归调用的最初始状态
        return dp[N - 1][M - 1];
    }

动态规划专题

leetcode.486. 预测赢家

数字转字符串,有多少种转化结果

背包问题–填满背包的最大价格

leetcode 322 题 零钱兑换文章来源地址https://www.toymoban.com/news/detail-804303.html

到了这里,关于leetcode1143. 最长公共子序列-动态规划(java)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (Java) 算法——动态规划 最长公共子序列 图解

    遇到了用动态规划来求解最长公共子序列问题,算法这块儿比较薄弱,便想着在网上找现成的思路和代码,也算拾人牙慧,但有一点没想到,都已经22年了,关于LCS问题网上给出的答案如此一言难尽……,只有零散几篇对于 新手 来说比较友好,但也仅仅这样,好在自己花了点

    2023年04月08日
    浏览(47)
  • 代码随想录第53天|● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和 动态规划

    dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j] 通过pre记录前一个dp[j-1] 循环中记录cur为dp[i],循环结束后再更新pre=cur。 和最长公共子序列相同 注意pre和cur放置的位置 dp[i]:包括下标i(以nums[i]为结尾)的最大连续子序列和为dp[i

    2024年03月08日
    浏览(51)
  • Leetcode1143. 最长公共子序列

    解题思路 求两个数组或者字符串的最长公共子序列问题,肯定是要用动态规划的。下面的题解并不难,你肯定能看懂。 首先,区分两个概念:子序列可以是不连续的;子数组(子字符串)需要是连续的; 另外,动态规划也是有套路的:单个数组或者字符串要用动态规划时,

    2024年01月25日
    浏览(45)
  • 算法:动态规划——最长公共子序列

    动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 与分治法不同的是,适合于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。若用分治法解这类问题,则分解得到的

    2023年04月27日
    浏览(60)
  • 【算法-动态规划】最长公共子序列

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年01月23日
    浏览(47)
  • 【LeetCode】1143.最长公共子序列(闫氏dp可视化无分析)

      推荐一下这道题的可视化过程 最长公共子序列 - 动态规划 Lngest Common Subsequence - Dynamic Programming_哔哩哔哩_bilibili  

    2024年02月15日
    浏览(46)
  • 【LeetCode动态规划#14】子序列系列题(最长递增子序列、最长连续递增序列、最长重复子数组、最长公共子序列)

    力扣题目链接(opens new window) 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 示例 1: 输入:nums = [10,9,2,5,3,7,101,18] 输出

    2024年02月01日
    浏览(56)
  • 【动态规划】最长公共子序列——算法设计与分析

    子序列是给定序列中在任意位置去掉任意多个字符后得到的结果。例如: 给定序列 X X X : X : A B C B D A B X:ABCBDAB X : A BCB D A B X X X 的子序列: X 1 : A B C B D A B X_1:ABCBDAB X 1 ​ : A BCB D A B X 2 : A B C B X_2:ABCB X 2 ​ : A BCB X 3 : A C B B X_3:ACBB X 3 ​ : A CBB 给定两个序列

    2024年02月05日
    浏览(55)
  • LeetCode刷题 | 1143. 最长公共子序列、1035. 不相交的线、53. 最大子数组和

    给定两个字符串  text1  和  text2 ,返回这两个字符串的最长  公共子序列  的长度。如果不存在  公共子序列  ,返回  0  。 一个字符串的  子序列   是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后

    2024年02月12日
    浏览(43)
  • 【动态规划】最长公共子序列(Java)

    给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。

    2024年01月18日
    浏览(76)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包