EOJ 1085 最長連續公共子串行

2021-08-28 23:37:25 字數 1013 閱讀 8893

由於問題中給定字串長度過大,所以一般的動態規劃會超時

該部落格中給出的一種基於字尾陣列的思路可以解決該問題

另一種同樣基於字尾陣列的思路分析:

如果採用最原始的做法,一般會涉及到三層迴圈,第一,二層用於遍歷所有的首字母,第三層用於檢測公共長度,如果資料沒有任何預處理,顯然這樣的三層迴圈是不可避免的,這裡我們可以把第三層迴圈:

a b c d e f g

a o e f e f g

(表示正在從第乙個串的e和第二個串的e開始往後匹配)

等價為另一種形式

cmp(「efg」,「efg」);

即比較這兩個字串字尾的公共長度

那麼在這種思想下,本問題就可以等價為:從字串a的所有字尾和字串b的所有字尾中,找到一對字首公共長度最大的

很直觀的,我們會發現其中有很多字尾間的嘗試性比較是無意義的,因為它們之間的"差距"太大了,這裡我們可以借助另一種問題來思考,比如說有兩個陣列arr1和arr2,想從中找到相等的一對數,二重迴圈的確是一種辦法,但是我們明顯知道這其中有過多沒意義的操作,我們應該只需要對那些相對較近的進行嘗試就可以得到結果,一種方法就是對兩個陣列進行排序,這樣的話只需要進行一次o(n+m)的掃瞄就可以得到結果,大致掃瞄思路如下

1—23    4

5    5

7    8

9    10

1  / 2

3 /  4

5    5

7    8

9    10

1    2

3—45    5

7    8

9    10

1    2

3  / 4

5/   5

7    8

9    10

1    2

3    4

5—5 matched

7    8

9    10

而字串本身也是可以進行排序的,所以就可以進行和上面相同的處理(字尾陣列的排序細節略),來減少多餘的比較操作(後續的掃瞄方式略)

最長公共連續子串和最長連續公共子串行

用二維陣列c i j 記錄串x1 x2 x i x1x2 xi與y 1y 2 y j y1y2 yj 的lcs長度,則可得到狀態轉移方程c i,j 0c i 1 j 1 1max c i,j 1 c i 1,j i 0 orj 0i,j 0a ndxi y j i,j 0a ndxi y j pub...

求最長連續公共子串

說到求最長公共子串首先想到的是逐個子串比較,但是那樣的話演算法的複雜度太高,後來就想到用矩陣的方法去解決 思路如下 比如字元創a abcdefg 和字串b bdeabc 建立矩陣如下圖所示 發現如果連續的斜線值為1的長度最長的話 則為最長公共子串 則abc為最長公共子串 那我們可把矩陣進化為 我們在...

最長公共連續子串

這是兩個字串,所以狀態轉移矩陣肯定是二維矩陣。另外dp i j 代表的意思不是分別乙個字串的前 i 個和另乙個字串的前 j 個字元裡面的最長連續子串。而是以a i 和b j 為末端的公共連續子串長度。如果dp i j 代表是目前最長連續子串,那麼遞推公式就寫不出來,因為不知道dp i j 中公共子串...