給你乙個序列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...