方法
一、遞迴
採用遞迴的方法,**簡單,但是速度比較慢,當字串比較大的時間,多次遞迴會計算一些重複的過程,因此速度很很慢。
#include
using
namespace
std;
int lcslength(int i, int j);
string x, y;
int lenx, leny;
int main()
return0;}
int lcslength(int i, int j)
方法
二、動態規劃
可參考部落格鏈結
引進乙個二維陣列c,用c[i][j]記錄x[i]與y[j] 的lcs 的長度,b[i][j]記錄c[i][j]是通過哪乙個子問題的值求得的,以決定搜尋的方向。
我們是自底向上進行遞推計算,那麼在計算c[i,j]之前,c[i-1][j-1],c[i-1][j]與c[i][j-1]均已計算出來。此時我們根據x[i] = y[j]還是x[i] != y[j],就可以計算出c[i][j]。
演算法分析:
由於每次呼叫至少向上或向左(或向上向左同時)移動一步,故最多呼叫(m + n)次就會遇到i = 0或j = 0的情況,此時開始返回。返回時與遞迴呼叫時方向相反,步數相同,故演算法時間複雜度為θ(m + n)。
**實現如下:
#include
using
namespace
std;
#define maxlen 1002
int c[maxlen][maxlen];
int lcslength(string x, string y, int lenx, int leny, int c[maxlen]);
int main()
return0;}
int lcslength(string x, string y, int lenx, int leny, int c[maxlen])
else
if(c[i-1][j] >= c[i][j-1])else}}
return c[lenx][leny];
}
求兩個字串的最長公共子串行
autor baker time 25 5 06 求兩個字串的最長公共子串行。x的乙個子串行是相應於x下標序列的乙個子串行,求解兩個序列的所有子串行中長度最大的,例如輸入 pear,peach輸出 pea。分析 次題可用動態規劃演算法解決。首先定義乙個二維陣列 a a i j m g ddgg dd...
求兩個字串的最長公共子串行
動態規劃解決lcs問題的時間複雜度為o mn 這比簡單的遞迴實現要快多了。空間複雜度是o mn 因為使用了乙個動態規劃表。兩個字串對應的最長公共子串行不一定唯一,這個程式輸出所有的lcs內容。基本思想是 具體參考文章 include include include include include i...
兩個字串的最長公共子串行
解題分析 設兩個序列x y 用lsc x,y 表示最長公共子串行。1.如果xn yn。則該元素一定存在於公共子串行中,所以可化為尋求子問題lsc x 1,y 1 用公式可表示為lsc x,y lsc x 1,y 1 1。2.如果xn yn。則該元素不存在於公共子串行中,所以轉而去尋求兩個子問題,即l...