【leetcode】1143.最长公共子序列

题目:最长公共子序列
解题思路:
动态规划算法。
设序列X ={x1x2 … xm}和Y ={y1y2 … yn}的最长公共子序列为Z ={z1z2 … zk} ,则有:
(1)若有xm = yn ,则zk = xm = yn ,且Zk-1 是 Xm-1和Yn-1的最长公共子序列。
(2)若有xm ≠ yn ,且zk ≠ xm ,且Zk-1 是 Xm-1和Yn的最长公共子序列。
(3)若有xm ≠ yn ,且zk ≠ yn ,且Zk-1 是 Xm和Yn-1的最长公共子序列。
其中Xm-1 ={x1x2 … xm-1}, Yn-1 ={y1y2 … yn-1}和Zk-1 ={z1z2 … zk-1}

用c[i,j]表示序列{X1…Xi}与序列{Y1…Yj}的最长公共子序列的长度,则有以下结论:
在这里插入图片描述

代码实现:

class Solution {
public:
    vector<vector<int>> c;
    int LCS(string &text1, string &text2, int i, int j){
        if(c[i][j]!=-1){
            return c[i][j];
        }
        if(i==0 || j==0){
            c[i][j]=0;
            return 0;
        }
        if(text1[i-1]==text2[j-1]){
            c[i][j]=LCS(text1,text2,i-1,j-1)+1;
            return c[i][j];
        }
        int l1=LCS(text1,text2,i,j-1);
        int l2=LCS(text1,text2,i-1,j);
        c[i][j]=l1>l2?l1:l2;
        return c[i][j];
    }
    int longestCommonSubsequence(string text1, string text2) {
        int len1=text1.length(),len2=text2.length();
        c=vector<vector<int>>(len1+1,vector<int>(len2+1, -1));
        return LCS(text1,text2,len1,len2);
    }
};
发布了138 篇原创文章 · 获赞 168 · 访问量 32万+

猜你喜欢

转载自blog.csdn.net/qq_24734285/article/details/102810665