Java最長公共子串行

2021-08-24 17:57:10 字數 1479 閱讀 6346

問題描述:

最長公共子串行定義:兩個或多個已知數列的子串行集合中最長的就是最長公共子串行。

比如數列a = 「abcdef」和b = 「adefcb」,那麼兩個數列的公共子串行集合有,其中最長

的就是adef,這就是最長公共子串行。

注意:最長公共子串行的公共子串行裡的元素可以不相鄰,但是公共子字串必須是連線在一起的,比如a和b

的公共子字串是「def」。

用動態規劃法來求解最長公共子串行,因為最長公共子串行具有最有子結構性質,可以分成子問題來遞迴求最優

解,最後組合子問題求解出問題。用c[i][j]記錄x[i]與y[j] 的lcs 的長度,求解問題c[i,j],可以分成c[i­1][j­1]、c[i­

1][j]、c[i][j­1]子問題來求解,依次遞堆到最小子問題,動態規劃的遞迴式描述為

時間複雜度分析:

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...