最長公共子序列(LCS)

cnblogsspa

belongcode

「cnblogs」 和 」blong「的最長公共子序列爲4blog

方法1-->枚舉字符串

將長度爲M和N的長度的字符串進行匹配,須要匹配2M * 2N次,複雜度爲指數級string

方法2-->動態規劃it

Step1->計算公共子序列長度class

Step2->根據長度回溯求出最長公共子序列方法

現有兩個序列X={x1,x2,x3,,,xi},Y={y1,y2,y3,,,yi}im

設C[i,j]用於保存Xi與Yj的最長公共子序列長度static

遞推方程爲->

 

 

例如->

 

 

動態規劃一個重要的性質即是解決‘子序列重疊問題’,避免重複計算

C[i,j]一直保存着當前(Xi,Yj)的最大子序列長度

C#代碼-->

       private static int calculateLCS(String s1, String  s2)
        {
            int len_s1 = s1.Length;
            int len_s2 = s2.Length;
            int[,] C = new int[len_s2 + 1, len_s1 + 1];

            for (int i=0;i<=len_s2;i++)
            {
                C[i, 0] = 0;
            }
            for (int j=0;j<=len_s1;j++)
            {
                C[0, j] = 0;
            }
        string same = "";
for (int i=1;i<=len_s2;i++) { for(int j= 1;j<=len_s1;j++) { if (s2[i-1] == s1[j-1]) { C[i, j] = C[i - 1, j - 1] + 1;
               same += s2[i - 1]; }
else { C[i, j] = Math.Max(C[i - 1, j], C[i, j - 1]); } Console.Write(C[i, j]+" "); } Console.WriteLine(""); } Console.WriteLine(same); return C[len_s2,len_s1]; }

 結果-->

 same能夠算出亂序lcs數值

時間複雜度爲O(MN),空間複雜度爲O(MN)

相關文章
相關標籤/搜索