最大公共子串行 一維陣列滾動求值

2022-08-02 18:15:19 字數 1151 閱讀 4141

給定乙個序列x=,另乙個序列y=,若存在乙個嚴格遞增的x的下標序列對所有的1,2,3,...,k,都滿足x(ik)=yk,則稱y是x的子串行

比如y=是x=的子串行

如果z既是x的子串行,又是y的子串行,則稱z為x和y的公共子串行

設x=,y=為兩個序列,z=是他們的任意公共子串行

經過分析,我們可以知道:

1、如果xm = yn,則zk = xm = yn 且 zk-1是xm-1和yn-1的乙個lcs

2、如果xm != yn 且 zk != xm,則z是xm-1和yn的乙個lcs

3、如果xm != yn 且 zk != yn,則z是xm和yn-1的乙個lcs

我們可以從上述看出,當使用二維陣列存放最優值資料是會浪費大量的空間,有許多值只用此次

從上述分析,不難發現可以用一維陣列存值

不難發現,相等時他的更新值是」前乙個值未更新時的值+1「,則可以用乙個變數」tempo「存放舊值

變數」temp「則一直為」位置i-1「的值

1/*2

problem:最長公共子串行--> 一維陣列

author:itcod3*/

45 #include 6 #include 7 #include 89

using

namespace

std;

1011

int lpso(string m1, string

m2)1235}

36else

3742

}43 /* st1當前str[i] 比較後 set的狀態

cout << i << ": "

;44for (int i = 0; i < lm2 + 1; i++)

45 cout << set[i] <

46 cout <

48return

set[lm2];49}

5051

intmain()

52

最大公共子串行

對於兩個字串,請設計乙個高效演算法,求他們的最長公共子串行的長度,這裡的最長公共子串行定義為有兩個序列u1,u2,u3.un和v1,v2,v3.vn,其中ui給定兩個字串a和b,同時給定兩個串的長度n和m,請返回最長公共子串行的長度。保證兩串長度均小於等於300。測試樣例 1a2c3d4b56 10...

最大公共子串行,最大公共子串,最大回文子串

1 兩個字串中最長公共子串行 該問題是動態規劃的經典問題,找出的公共序列不一定是連續的,參考資料很多,這裡就貼出公式和 做個簡單的筆記。設序列a,b的長度分別為n和m,l i,j 為a i b j 的最長公共子串行長度,有遞推公式 時間複雜度為o mn 如下 define n 50 intlcs c...

DP最大公共子串行

題意 求兩個串的最長公共子串行 中的dp i j 表示0到i 1跟0到j 1的最長公共子串行 空間變化圖如下 分析如下 1.dp i j dp i 1 j 1 1 a i b j 因為加和都是要和他前一項的基礎上加和所以是dp i 1 j 1 2.dp i j max dp i 1 j dp i j...