問題描述:最長公共子串行定義:兩個或多個已知數列的子串行集合中最長的就是最長公共子串行。
比如數列a = 「abcdef」和b = 「adefcb」,那麼兩個數列的公共子串行集合有,其中最長
的就是adef,這就是最長公共子串行。
注意:最長公共子串行的公共子串行裡的元素可以不相鄰,但是公共子字串必須是連線在一起的,比如a和b
的公共子字串是「def」。
用動態規劃法來求解最長公共子串行,因為最長公共子串行具有最有子結構性質,可以分成子問題來遞迴求最優
解,最後組合子問題求解出問題。用c[i][j]記錄x[i]與y[j] 的lcs 的長度,求解問題c[i,j],可以分成c[i1][j1]、c[i
1][j]、c[i][j1]子問題來求解,依次遞堆到最小子問題,動態規劃的遞迴式描述為
時間複雜度分析:
longestcommonsubsequence(string str1, string str2)`方法:計算表中每個
元素需要`o(1)`時間,所以此方法的時間複雜度為`o(mn)`。
print(int opt, string x, string y, int i, int j)`方法:每次遞迴
中變數i和j中至少增加1.所以該演算法時間複雜度為o(m+n)。
public class main
system.out.println();
}system.out.println();
system.out.println();
//輸出lcs
print(re,str1,str2,str1.length(),str2.length());
}//假如返回兩個字串的最長公共子串行的長度
public static intlongestcommonsubsequence(string str1,string str2)
for(int j = 0;j <= str2.length();j++)
//填充矩陣
for(int i = 1;i <= str1.length();i++)
else}}
return matrix;
}//根據矩陣輸出lcs
public static void print(int opt,string x,string y,int i,int j)
//如果x中第i個字元和y中第j個字元相等就遞迴i - 1,j - 1
if(x.charat(i - 1) == y.charat(j - 1))
//如果不相等,判斷i - 1和j的公共子串的長度與i和j - 1的公共子串的長度
else if(opt[i - 1][j] >= opt[i][j])
else}}
最長公共子串行 最長公共子串
1 最長公共子串行 採用動態規劃的思想,用乙個陣列dp i j 記錄a字串中i 1位置到b字串中j 1位置的最長公共子串行,若a i 1 b j 1 那麼dp i j dp i 1 j 1 1,若不相同,那麼dp i j 就是dp i 1 j 和dp i j 1 中的較大者。class lcs el...
最長公共子串行 最長公共子串
1.區別 找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。而最長公共子串行則並不要求連續。2 最長公共子串 其實這是乙個序貫決策問題,可以用動態規劃來求解。我們採用乙個二維矩陣來記錄中間的結果。這個二維矩陣怎麼構造呢?直接舉個例子吧 bab 和 caba 當然我們現在一眼就可以看出來最長公...
最長公共子串 最長公共子串行
子串要求連續 子串行不要求連續 之前的做法是dp求子序列 include include include using namespace std const int inf 0x3f3f3f3f const int mod 1000000007 string s1,s2 int dp 1010 10...