LeetCode 1143.最長公共子序列

reo:C++發表於2020-12-08

題目描述:

給定兩個字串 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。

提示:

1 <= text1.length <= 1000
1 <= text2.length <= 1000
輸入的字串只含有小寫英文字元。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/longest-common-subsequence

分析:

典型的dp問題:
兩個字串s1,s2。
若s1[i]==s2[j],則該字元在公共子序列中,dp[i][j]=dp[i-1][j-1]+1。
若不相等,則dp[i][j]=max(dp[i][j-1],dp[i-1][j])。
方法一:

class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
        int m=text1.length();
        int n=text2.length();
        int dp[m+1][n+1];
        for(int i=0;i<=m;i++){
            dp[i][0]=0;
        }
        for(int j=0;j<=n;j++){
            dp[0][j]=0;
        }
        for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(text1[i-1]==text2[j-1]){
                    dp[i][j]=1+dp[i-1][j-1];
                }
                else{
                    dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
                }
            }
        }
        return dp[m][n];
    }
};

相關文章