力扣1143. 最長公共子序列 動態規劃之最長公共子序列

愛學習的阿強發表於2020-10-03

給定兩個字串 text1 和 text2,返回這兩個字串的最長公共子序列的長度。

一個字串的 子序列 是指這樣一個新的字串:它是由原字串在不改變字元的相對順序的情況下刪除某些字元(也可以不刪除任何字元)後組成的新字串。
例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。兩個字串的「公共子序列」是這兩個字串所共同擁有的子序列。

若這兩個字串沒有公共子序列,則返回 0。

示例 1:

輸入:text1 = “abcde”, text2 = “ace”
輸出:3
解釋:最長公共子序列是 “ace”,它的長度為 3。

示例 2:

輸入:text1 = “abc”, text2 = “abc”
輸出:3
解釋:最長公共子序列是 “abc”,它的長度為 3。

示例 3:

輸入:text1 = “abc”, text2 = “def”
輸出:0
解釋:兩個字串沒有公共子序列,返回 0。

class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
        int n=text1.size();
        int m=text2.size();
        int dp[n+1][m+1];
        for(int i=0;i<=n;i++){
            dp[i][0]=0;
        }
        for(int j=0;j<=m;j++){
            dp[0][j]=0;
        }
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            {
                if(text1[i-1]==text2[j-1]){//字串陣列下標是0到length-1
                    dp[i][j]=dp[i-1][j-1]+1;
                }else{
                    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
                }
            }
        
        return dp[n][m];
    }
};

一、確定狀態

狀態:序列1的長度i,和序列2的長度j
子問題描述:
在這裡插入圖片描述

二、轉移方程

在這裡插入圖片描述其實想要糾正一下,字串陣列中下標是0到i-1的,如果1到i,不僅第一個字元讀不到,還會讀到最後一個結束符‘\0’,這裡把我坑了…

三、初始狀態、邊界

陣列大小dp[n+1][m+1],n、m是字串長度

在這裡插入圖片描述

四、如何遍歷、結果

逐行遍歷,結果dp[n][m]

求解最優子序列怎麼得到

按方向劃分,存放進陣列b[n][m],求解子序列
在這裡插入圖片描述

相關文章