刷題之路 最長公共字串

2021-07-13 04:53:19 字數 922 閱讀 9882

給定兩個字串a和b,返回兩個字串的最長公共子串行的長度。例如,a="1a2c3d4b56」,b="b1d23ca45b6a」,」123456"或者"12c4b6"都是最長公共子串行。

給定兩個字串a和b,同時給定兩個串的長度n和m,請返回最長公共子串行的長度。保證兩串長度均小於等於300。

測試樣例:

"1a2c3d4b56",10,"b1d23ca45b6a",12

返回:6

經典動態規劃問題,用乙個二維陣列res實現。

首先確定初始狀態,res[0][0]表示以a陣列第乙個字元結尾與b陣列第乙個字元結尾時,最長的公共字元,很顯然,如果兩個字元相等,則lcs長度為1,否則為0;以此類推,res[i][0],即為不斷擴大第乙個字串直到最後,如果其中有相等的字元,則之後的lcs均等於1,之前等於0,則確定了第一列,同理,res[0][j]來確定第一行。完成狀態初始化。

對於之後res[1][1]來說,存在三種情況,首先,比較res[0][1]與res[1][0],其中較大的,可能為當前字元的最大長度,第三種情況即為同時擴大兩個字串,如果擴大的字元相等,則res[1][1]應該等於res[0][0]+1,取三個數中較大的數字作為res[1][1]的值

則遞推公式就為res[i][j]=max(res[i-1][j],res[i][j-1],temp) 其中如果a[j]==b[j] temp=res[i-1][j-1]+1 else temp=0;

**為class lcs {

public:

int findlcs(string a, int n, string b, int m) {

// write code here

vectorsub(m,1);//整個二位陣列先置1

vector> res(n,sub);

int i,j,temp,temp2;

for(i=0;i

最長公共字串

include include include include include customer.h using namespace std 最長公共字串 動態規劃 假設需要求得字串為str1,str2。函式f m,n 分別為 str1 m str2 n 結尾的公共字串長度。有以下遞推公式 遞推邊界...

最長公共字串

牛客網的題目鏈結 對於兩個字串,請設計乙個時間複雜度為o m n 的演算法 這裡的m和n為兩串的長度 求出兩串的最長公共子串的長度。這裡的最長公共子串的定義為兩個序列u1,u2,un和v1,v2,vn,其中ui 1 ui 1,vi 1 vi 1,同時ui vi。給定兩個字串a和b,同時給定兩串的長度...

最長公共字串和最長公共子串行

給出兩個字串,找到最長公共子串,並返回其長度。建立乙個矩陣來儲存兩個字串出現相同字元的地方,比如 abccd 和 abcefc 就有 abccd a10000 b02000 c00300 e00040 f00000 c00100 這樣就有每次遇到相等的都加上下他的斜上方的位置的值,然後使用乙個max...