最長公共子串的動態規劃解法及其優化

2021-07-22 16:06:43 字數 892 閱讀 5981

最長公共子串問題是:給定兩個字串str1和str2,返回兩個字串的最長公共子串(必須連續)

舉例: str1 = "abcd12" str2="ebcd32" 它們的最長公共子串是 "bcd"

原始解法:

設dp[i][j] 表示 以str1[i]和str2[j]最為公共子串的最後乙個字元的情況下,公共子串最長能有多長。

邊界值: 如果 str1[i] = str2[0]則dp[i][0] =1 否則為 dp[i][0]=0;如果str2[j] = str1[0] 則dp[0][j]=1 否則 dp[0][j] =0

一般值只有兩種情況:

1)如果 str1[i] ==str2[j] : 則dp[i-1][j-1]+1 .比如 str1 = "cd1234" str2="abd1234" dp[5][6] 的意思是以 str1[5]  '4' 和str2[6] '4'結尾的最長公共子串 ,顯然是dp[4][5]+1  即 "123"   後面再加上'4' .

2)如果str1[i]!=str2[j] :則dp[i][j]=0 。

生成動態規劃表dp 之後,得到最長公共子串是非常容易的。如 str1 = "cd1234" str2="abd1234"的最長公共子串長度是 dp[5][6]=4;證明str1[5]相左4個字元就是最長公共子串的內容了。

下面是實現**:

#include#include#includeusing namespace std;

int dp[1000][1000];

int main()

}else

i++;

j++;

}if(col >0)

else

}for(int i =end_index -max_len+1;i<=end_index;i++) cout<

最長公共子串 最長公共子串 動態規劃

有兩個字串 可能包含空格 請找出其中最長的公共連續子串,輸出其長度。長度在1000以內 例如 輸入 abcde bcd 輸出 3 1 把兩個字串分別以行和列組成乙個二維矩陣。2 比較二維矩陣中每個點對應行列字元中否相等,相等的話值設定為1,否則設定為0。3 通過查詢出值為1的最長對角線就能找到最長公...

最長公共子串(動態規劃)

描述 計算兩個字串的最大公共子串 longest common substring 的長度,字元不區分大小寫。輸入 輸入兩個字串 輸出 輸出乙個整數 樣例輸入 asdfas werasdfaswer樣例輸出 6 參考 這裡的最大公共字串要求的字串是連續的。求字串的方法和求子序列方法類似 當s i t...

最長公共子串 動態規劃

題目 給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為1000。示例 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。思想 動態規劃 步驟 第一步 確定子問題。在這一步重點是分析那些變數是隨著問題規模的變小而變小的,那些變數與問題的規模無關。第二步 確定狀態...