最長公共子串行LCS

2021-07-11 17:24:46 字數 972 閱讀 9034

問題描述:給出字串a,b,求兩個字串的最長公共子串行,輸出長度和子串路徑。

問題思路:演算法課作業,感覺自己輸出路徑這裡不會,用遞迴挺巧妙的,所以記錄一下。

1.dp 求最長公共子串行

[1] : 因為a[i] == b[i],dp[i][j] = dp[i - 1][j - 1] + 1;

[2] : a[i] != b[i],dp[i][j] =max( dp[i - 1][j],dp[i][j - 1]) ;

[3] : 最長公共子串行長度

2.遞迴輸出路徑(最長公共子串行)

用ret[i][j],標記該點是從**得到。

①ret[i][j] == 0,則從dp[i - 1][j - 1]

②ret[i][j] == -1,則從dp[i - 1][j]

③ret[i][j] == 1,則從dp[i][j - 1]

以下是**:

#include 

#include

using

namespace

std;

string a,b,s;

int dp[105][105];

int ret[105][105];

int n,m;

void solve()

else

if (dp[i][j - 1] > dp[i - 1][j])

else}}

}void print_lcs(int r,int c)

if (ret[r][c] == 0)

else

if (ret[r][c] == 1)

else

}int main()

LCS 最長公共子串行

問題描述 我們稱序列z z1,z2,zk 是序列x x1,x2,xm 的子串行當且僅當存在嚴格上 公升的序列 i1,i2,ik 使得對 j 1,2,k,有 xij zj。比如z a,b,f,c 是 x a,b,c,f,b,c 的子串行。現在給出兩個序列 x和 y,你的任務是找到 x和 y的最大公共子...

LCS最長公共子串行

求兩個字串的最大公共子串行問題 子串行的定義 若給定序列x 則另一串行z 是x的子串行是指存在乙個嚴格遞增下標序列使得對於所有j 1,2,k有 zj xij。例如,序列z 是序列x 的子序列,相應的遞增下標序列為。分析 用動態規劃做 1.最長公共子串行的結構 事實上,最長公共子串行問題具有最優子結構...

LCS最長公共子串行

lcs是longest common subsequence的縮寫,即最長公共子串行。乙個序列,如果是兩個或多個已知序列的子串行,且是所有子串行中最長的,則為最長公共子串行。複雜度對於一般的lcs問題,都屬於np問題。當數列的量為一定的時,都可以採用動態規劃去解決。解法動態規劃的乙個計算最長公共子串...