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];  
            }  

                

猜你喜欢

转载自blog.csdn.net/asdasdasdasasd1111/article/details/80766513