問題描述:
設現有兩個子串行,請設計演算法計算其最長公共子串行。
問題分析:
此問題採用動態規劃來解決。動態規劃三步驟:
1 定義函式dp[i][j]。
2 找通項公式(常見dp[i][j]與dp[i-1][j]、dp[i][j-1]、dp[i-1][j-1])之間關係。
3 求出初始值。
第一步:定義dp[i][j]
由於所求為兩個序列的最長子序列,因此dp[i][j]可表示為長度為i的a序列以及長度為j的b序列的最長公共子串行,如dp[2][4]表示長度為2的a序列和長度為4的b序列的最長公共子串行。
第二步:找通項公式
首先考慮dp[i-1][j]、dp[i][j-1]、dp[i-1][j-1]的關係,可知,分別表示為a減去乙個末尾序列,b減去乙個末尾序列、ab同時減去乙個末尾序列的最長公共子串行。然後分析問題肯定與末尾序列有關係,末尾序列a[i]和b[j]有兩種關係,相等或者不相等。下面分類討論兩種情況下四個dp之間的關係。
case1:a [ i ] = b [ j ]
則dp [ i ] [ j ] = dp [ i-1 ] [ j-1 ]+1(注:dp[i][j]表示長度,+1為加上最後乙個序列),
case2:a [ i ] != b [ j ]
則dp[i][j] = max;(捨棄其中乙個序列的尾序列,繼續dp,並選擇最長值),
至此,dp之間的關係已經找到。
第三步:判斷初值
很明顯,當其中乙個序列為0時,dp=0恆成立。
因此dp[i][0] = 0(i from 0-i)、dp[0][j] = 0(j form 0-j);
至此,動態規劃最長公共子串行已經完成。
最長公共子串行**
int
lcs(string a,string b)
return dp[sizea]
[sizeb]
}
動態規劃之最長公共子串行(演算法導論)
1 一些概念 子串行 就是將原序列中的0個或多個元素去掉之後得到的序列。子串行不一定在原序列中連續。比如 x 中的乙個子串行可以為 也可以是 2 問題描述 現有兩個序列分別為 x 和y 求x和y的長度最大的公共子串行。3 問題解析 要尋找x和y的最長公共子串行,可以從前往後找,也可以從後向前找,若存...
最長公共子串 最長公共子串 動態規劃
有兩個字串 可能包含空格 請找出其中最長的公共連續子串,輸出其長度。長度在1000以內 例如 輸入 abcde bcd 輸出 3 1 把兩個字串分別以行和列組成乙個二維矩陣。2 比較二維矩陣中每個點對應行列字元中否相等,相等的話值設定為1,否則設定為0。3 通過查詢出值為1的最長對角線就能找到最長公...
《演算法導論》學習筆記 最長公共子串行(動態規劃)
給定兩個序列x x1,x 2,x3 xm和y y 1,y2 y3,yn,求x和y的最長公共子串行。例子 x a,b,c,b,d,a,b y b,d,c,a,b,a 最長公共子串行為b,c,b,a 注意 最長公共字串 longestcommonsubstring 要求元素必須連續,最長公共子串行不要求...