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)