题目链接

LeetCode

题目描述

给定两个字符串 text1text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 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
  • text1text2 仅由小写英文字符组成。

    解题思路

    动态规划


    image.pngimage.png
    image.png
    1143. 最长公共子序列 - 图4
  1. class Solution {
  2. public:
  3. int longestCommonSubsequence(string text1, string text2) {
  4. int len1 = text1.length(),len2 = text2.length();
  5. if(len1==0||len2==0)
  6. return 0;
  7. vector<vector<int>> dp(len1+1,vector<int>(len2+1,0));
  8. for(int i=1;i<=len1;++i){
  9. for(int j=1;j<=len2;++j){
  10. if(text1[i-1]==text2[j-1]){
  11. dp[i][j] = dp[i-1][j-1]+1;
  12. }else{
  13. dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
  14. }
  15. }
  16. }
  17. return dp[len1][len2];
  18. }
  19. };
class Solution {
    public int longestCommonSubsequence(String text1, String text2) {
        int s1 = text1.length(), s2 = text2.length();
        int[][] dp = new int[s1+1][s2+1];
        for(int i=1;i<=s1;i++){
            for(int j=1;j<=s2;j++){
                if(text1.charAt(i-1) == text2.charAt(j-1)){
                    dp[i][j] = dp[i-1][j-1] + 1;
                }else{
                    dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
                }
            }
        }
        return dp[s1][s2];
    }
}

// StringBuilder处理字符串性能比String好
class Solution {
    public int longestCommonSubsequence(String text1, String text2) {
        int s1 = text1.length(), s2 = text2.length();
        StringBuilder sb1 = new StringBuilder(text1);
        StringBuilder sb2 = new StringBuilder(text2);
        int[][] dp = new int[s1+1][s2+1];
        for(int i=1;i<=s1;i++){
            for(int j=1;j<=s2;j++){
                if(sb1.charAt(i-1) == sb2.charAt(j-1)){
                    dp[i][j] = dp[i-1][j-1] + 1;
                }else{
                    dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
                }
            }
        }
        return dp[s1][s2];
    }
}
  • 时间复杂度 O(mn)
  • 空间复杂度 O(mn)