演算法筆記 問題 A 最長公共子串行(LCS)

2021-10-05 17:24:23 字數 1655 閱讀 7267

給你乙個序列x和另乙個序列z,當z中的所有元素都在x中存在,並且在x中的下標順序是嚴格遞增的,那麼就把z叫做x的子串行。

例如:z=是序列x=的乙個子串行,z中的元素在x中的下標序列為<1,2,4,6>。

現給你兩個序列x和y,請問它們的最長公共子串行的長度是多少?

輸入輸入包含多組測試資料。每組輸入佔一行,為兩個字串,由若干個空格分隔。每個字串的長度不超過100。

輸出對於每組輸入,輸出兩個字串的最長公共子串行的長度。

樣例

輸入:

abcfbc abfcab

programming contest

abcd mnp

輸出:4

20

解題思路:

使用動態規劃求解

dp[i][j]表示字串str1的i號位與str2的j號位之間的最長公共子串行的長度

(其中 i ,j 的下標從1 開始)

1、將輸入的字串轉為字元陣列,且下標從1開始。

2、初始化dp陣列,即邊界問題dp[i][0] 和 dp[0][j] 都等於0

3、迴圈遍歷,求出dp陣列

下面為ac**:

/*

* @description: 最長公共子串行

* @author:

* @date: 2020-05-03 15:17:15

* @lastedittime: 2020-05-03 16:46:49

* @lasteditors: please set lasteditors

*/#include

#include

#include

using

namespace std;

const

int max_n =

100;

int dp[max_n]

[max_n]

;//dp[i][j]表示字串str1的i號位與str2的j號位之間的最長公共子串行的長度

char str1[max_n]

, str2[max_n]

;//存放字串的陣列

string a, b;

//輸入的字串

intmain()

for(

int j =

0; j < b.

size()

; j++

)//下面為初始化,確定邊界 即dp[i][0] = 0; dp[0][j] = 0;

for(

int i =

0; i <= a.

size()

; i++

)for

(int j =

0; j <= b.

size()

; j++

)//下面為狀態轉換方程

for(

int i =

1; i <= a.

size()

; i++

)else}}

cout << dp[a.

size()

][b.

size()

]<< endl;

}//system("pause");

return0;

}

演算法 最長公共子串行

好久沒做演算法題了,現在發現自己的演算法能力非常薄弱,所以特意練練,順便做個筆記方便以後檢視。今天整理一下最長公共子串行,最長公共子串行的問題常用於解決字串的相似度,是乙個非常實用的演算法,作為碼農,此演算法是我們的必備基本功。最長公共子串行,是指兩個字串可具有的長度最大的公共的子串行。聽著好像有點...

演算法 最長公共子串行

題目 給定兩個字串 text1 和 text2,返回這兩個字串的最長公共子串行的長度。乙個字串的 子串行 是指這樣乙個新的字串 它是由原字串在不改變字元的相對順序的情況下刪除某些字元 也可以不刪除任何字元 後組成的新字串。例如,ace 是 abcde 的子串行,但 aec 不是 abcde 的子串行...

最長公共子串行問題

給定整數a1,a2,an 可能有負值 求連續子串行和的最大值。為方便起見,如果所有整數都為負值,則最大子串行和為0 這是個顯而易見的方法,幾乎每個人在第一眼看到該問題都能夠想出來的方法。就是將所有的子串行找出來,然後求和最大的乙個。如果序列足夠大,該方法的效率可想而知。如下 include incl...