国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

leetcode1143. 最長公共子序列-動態(tài)規(guī)劃(java)

這篇具有很好參考價值的文章主要介紹了leetcode1143. 最長公共子序列-動態(tài)規(guī)劃(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 僅由小寫英文字符組成。

暴力遞歸

解題思路

我們用指針法:
一.先把兩個字符串轉(zhuǎn)成兩個字節(jié)數(shù)組
二.兩個指針分別卡住字符數(shù)組的最右邊
三.通過比較不斷移動指針位置,遇到相等的就加1,不等的就不加
以上是整體思路:
具體細(xì)節(jié).
先考慮base case .只有指針走到了頭,才會停止
所以base case 就是0 位置,
知道了0位置,還要考慮哪個數(shù)組在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 字節(jié)數(shù)組
     * @param str2 字節(jié)數(shù)組
     * @param i 字節(jié)數(shù)組str1 的下標(biāo)
     * @param j 字節(jié)數(shù)組str2 的下標(biāo)
     * @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 不等還要繼續(xù)移動str2 的指針就行比較有沒有相同的
            if(str1[i] == str2[j]){
                return 1;
            }else{
                return process(str1,str2,i,j - 1);
            }
        } else if (j == 0) {
            //j來到 0 位置 相等直接返回1 不等還要繼續(xù)移動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));
        }
    }

動態(tài)規(guī)劃

解題思路

動態(tài)規(guī)劃就是對遞歸的改寫,把遞歸過程,變成動態(tài)規(guī)劃表生成的過程.
改寫的三個步驟:
一.通過base case 先初始化能確定的值
二.通過遞歸過程去初始化剩余的值
三,返回遞歸調(diào)用的最初始狀態(tài).

代碼演示

    /**
     * 動態(tài)規(guī)劃
     * @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];
        //根據(jù)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));
            }
        }
        //返回遞歸調(diào)用的最初始狀態(tài)
        return dp[N - 1][M - 1];
    }

動態(tài)規(guī)劃專題

leetcode.486. 預(yù)測贏家

數(shù)字轉(zhuǎn)字符串,有多少種轉(zhuǎn)化結(jié)果

背包問題–填滿背包的最大價格

leetcode 322 題 零錢兌換文章來源地址http://www.zghlxwxcb.cn/news/detail-804303.html

到了這里,關(guān)于leetcode1143. 最長公共子序列-動態(tài)規(guī)劃(java)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • (Java) 算法——動態(tài)規(guī)劃 最長公共子序列 圖解

    (Java) 算法——動態(tài)規(guī)劃 最長公共子序列 圖解

    遇到了用動態(tài)規(guī)劃來求解最長公共子序列問題,算法這塊兒比較薄弱,便想著在網(wǎng)上找現(xiàn)成的思路和代碼,也算拾人牙慧,但有一點沒想到,都已經(jīng)22年了,關(guān)于LCS問題網(wǎng)上給出的答案如此一言難盡……,只有零散幾篇對于 新手 來說比較友好,但也僅僅這樣,好在自己花了點

    2023年04月08日
    瀏覽(22)
  • 代碼隨想錄第53天|● 1143.最長公共子序列 ● 1035.不相交的線 ● 53. 最大子序和 動態(tài)規(guī)劃

    代碼隨想錄第53天|● 1143.最長公共子序列 ● 1035.不相交的線 ● 53. 最大子序和 動態(tài)規(guī)劃

    dp[i][j]:長度為[0, i - 1]的字符串text1與長度為[0, j - 1]的字符串text2的最長公共子序列為dp[i][j] 通過pre記錄前一個dp[j-1] 循環(huán)中記錄cur為dp[i],循環(huán)結(jié)束后再更新pre=cur。 和最長公共子序列相同 注意pre和cur放置的位置 dp[i]:包括下標(biāo)i(以nums[i]為結(jié)尾)的最大連續(xù)子序列和為dp[i

    2024年03月08日
    瀏覽(26)
  • Leetcode1143. 最長公共子序列

    Leetcode1143. 最長公共子序列

    解題思路 求兩個數(shù)組或者字符串的最長公共子序列問題,肯定是要用動態(tài)規(guī)劃的。下面的題解并不難,你肯定能看懂。 首先,區(qū)分兩個概念:子序列可以是不連續(xù)的;子數(shù)組(子字符串)需要是連續(xù)的; 另外,動態(tài)規(guī)劃也是有套路的:單個數(shù)組或者字符串要用動態(tài)規(guī)劃時,

    2024年01月25日
    瀏覽(28)
  • 算法:動態(tài)規(guī)劃——最長公共子序列

    算法:動態(tài)規(guī)劃——最長公共子序列

    動態(tài)規(guī)劃算法與分治法類似,其基本思想也是將待求解問題分解成若干個子問題,先求解子問題,然后從這些子問題的解得到原問題的解。 與分治法不同的是,適合于用動態(tài)規(guī)劃法求解的問題,經(jīng)分解得到的子問題往往不是互相獨立的。若用分治法解這類問題,則分解得到的

    2023年04月27日
    瀏覽(22)
  • 【算法-動態(tài)規(guī)劃】最長公共子序列

    【算法-動態(tài)規(guī)劃】最長公共子序列

    ??????歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內(nèi)容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:kuan 的首頁,持續(xù)學(xué)習(xí),不斷總結(jié),共同進步,活到老學(xué)到老 導(dǎo)航 檀越劍指大廠系列:全面總

    2024年01月23日
    瀏覽(27)
  • 【LeetCode】1143.最長公共子序列(閆氏dp可視化無分析)

    【LeetCode】1143.最長公共子序列(閆氏dp可視化無分析)

    ? 推薦一下這道題的可視化過程 最長公共子序列 - 動態(tài)規(guī)劃 Lngest Common Subsequence - Dynamic Programming_嗶哩嗶哩_bilibili ?

    2024年02月15日
    瀏覽(20)
  • 【LeetCode動態(tài)規(guī)劃#14】子序列系列題(最長遞增子序列、最長連續(xù)遞增序列、最長重復(fù)子數(shù)組、最長公共子序列)

    【LeetCode動態(tài)規(guī)劃#14】子序列系列題(最長遞增子序列、最長連續(xù)遞增序列、最長重復(fù)子數(shù)組、最長公共子序列)

    力扣題目鏈接(opens new window) 給你一個整數(shù)數(shù)組 nums ,找到其中最長嚴(yán)格遞增子序列的長度。 子序列是由數(shù)組派生而來的序列,刪除(或不刪除)數(shù)組中的元素而不改變其余元素的順序。例如,[3,6,2,7] 是數(shù)組 [0,3,1,6,2,2,7] 的子序列。 示例 1: 輸入:nums = [10,9,2,5,3,7,101,18] 輸出

    2024年02月01日
    瀏覽(30)
  • 【動態(tài)規(guī)劃】最長公共子序列——算法設(shè)計與分析

    【動態(tài)規(guī)劃】最長公共子序列——算法設(shè)計與分析

    子序列是給定序列中在任意位置去掉任意多個字符后得到的結(jié)果。例如: 給定序列 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日
    瀏覽(27)
  • LeetCode刷題 | 1143. 最長公共子序列、1035. 不相交的線、53. 最大子數(shù)組和

    LeetCode刷題 | 1143. 最長公共子序列、1035. 不相交的線、53. 最大子數(shù)組和

    給定兩個字符串? text1 ?和? text2 ,返回這兩個字符串的最長? 公共子序列 ?的長度。如果不存在? 公共子序列 ?,返回? 0 ?。 一個字符串的? 子序列 ? 是指這樣一個新的字符串:它是由原字符串在不改變字符的相對順序的情況下刪除某些字符(也可以不刪除任何字符)后

    2024年02月12日
    瀏覽(25)
  • 【動態(tài)規(guī)劃】最長公共子序列(Java)

    給定兩個字符串 text1 和 text2,返回這兩個字符串的最長 公共子序列 的長度。如果不存在 公共子序列 ,返回 0 。 一個字符串的 子序列 是指這樣一個新的字符串:它是由原字符串在不改變字符的相對順序的情況下刪除某些字符(也可以不刪除任何字符)后組成的新字符串。

    2024年01月18日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包