【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);
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章