LCS-最大公共子序列(DP問題)

對兩個字符串求最大公共子序列,子序列意味着不是連續的序列。

    子問題:LCS(s1,s2)表示最大公共子序列

      首先基於一個判斷,

        1)s1和s2有相同的結尾x,那麼x一定在最大公共子序列中,  LCS(s1,s2)=LCS(s1[:-1],s2[:-1])+1

        2)s1和s2沒有相同結尾,那麼LCS(s1,s2)=max{ LCS(s1[:-1],s2),LCS(s1,s2[:-1]) }

            可以寫成下面的表達式,C[i,j]表示s1的前i個字符和s2的前j個字符的最大公共子序列,其中i=0或者j=0時,表示其中一個字符串爲空,這時候LCS=0

        

        僞代碼:

                int lcs(string str1, string str2, vector<vector<int>>& vec) {  
                        int len1 = str1.size();  
                        int len2 = str2.size();  
                        vector<vector<int>> c(len1 + 1, vector<int>(len2 + 1, 0));   #初始化(len1+1)個vector<int>(len2 + 1, 0)
                        for (int i = 0; i <= len1; i++) {  
                            for (int j = 0; j <= len2; j++) {  
                                if (i == 0 || j == 0) {  
                                    c[i][j] = 0;  
                                 }  
                                else if (str1[i - 1] == str2[j - 1]) {  
                                    c[i][j] = c[i - 1][j - 1] + 1;  
                                }  
                                else if (c[i - 1][j] >= c[i][j - 1]){  
                                    c[i][j] = c[i - 1][j];  
                                }  
                                else{  
                                    c[i][j] = c[i][j - 1];  
                                }  
                            }  #for (int j = 0; j <= len2; j++) {
                        }  #for (int i = 0; i <= len1; i++) {  
  
                return c[len1][len2];  
            }  

                

發佈了29 篇原創文章 · 獲贊 20 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章