最長公共子串行學習心得

2022-08-28 11:12:13 字數 1146 閱讀 8660

一、什麼是最長公共子串行

什麼是最長公共子串行呢?舉個簡單的例子吧,乙個數列s,若分別是兩個或多個已知序列的子串行,且是所有符合條件序列中最長的,則s稱為已知序列的最長公共子串行。

舉例如下,如:有兩個隨機數列,1 2 3 4 5 6 和 3 4 5 8 9,則它們的最長公共子串行便是:3 4 5。

一直不明白:最長公共子串和最長公共子串行的區別。

上網查了下,最長公共子串(longest common substirng)和最長公共子串行(longest common subsequence,lcs)的區別為:子串是串的乙個連續的部分,子串行則是從不改變序列的順序,而從序列中去掉任意的元素而獲得新的序列;也就是說,子串中字元的位置必須是連續的,子串行則可以不必連續。

三、動態規劃方法

1、序列str1和序列str2

·長度分別為m和n;

·建立1個二維陣列l[m.n];

·初始化l陣列內容為0

·m和n分別從0開始,m++,n++迴圈:

- 如果str1[m] == str2[n],則l[m,n] = l[m - 1, n -1] + 1;

- 如果str1[m] != str2[n],則l[m,n] = max

·最後從l[m,n]中的數字一定是最大的,且這個數字就是最長公共子串行的長度

·從陣列l中找出乙個最長的公共子串行

2、從陣列l中查詢乙個最長的公共子串行

i和j分別從m,n開始,遞減迴圈直到i = 0,j = 0。其中,m和n分別為兩個串的長度。

·如果str1[i] == str2[j],則將str[i]字元插入到子串行內,i--,j--;

·如果str1[i] != str[j],則比較l[i,j-1]與l[i-1,j],l[i,j-1]大,則j--,否則i--;(如果相等,則任選乙個)

圖1 效果演示圖

根據上圖,我們可以得到其中公共子串:b c b a 和 b d a b。

總感覺,上面這個過程說的不是很清楚,但是不知道怎麼才能更加清楚的表述??糾結啊。

最長公共子串行 最長公共子串

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