題目連接 講解連接 二維表思路 二維表思路與動規聯繫html
給定兩個字符串A和B,長度分別爲m和n,要求找出它們最長的公共子串,並返回其長度。例如:ios
A = "HelloWorld" B = "loop"atom
子序列和子串都是字符集合的子集,可是子序列不必定連續,可是子串必定是連續的。spa
dp[i][j]:以A中第i個字符結尾的子串和B中第j個字符結尾的子串的的最大公共子串的長度。.net
dp 的大小也爲 (n + 1) x (m + 1) ,多出來的一行和一列是第 0 行和第 0 列,初始化爲 0,表示空字符串和另外一字符串的子串的最長公共子串。code
咱們先判斷A的第i個元素和B的第j個元素是否相同,即判斷A[i - 1]和 B[j -1]是否相同,若是相同它就是dp[i - 1][j- 1] + 1,至關於在兩個字符串都去掉一個字符時的最長公共子串再加 1;不然最長公共子串取0。htm
相應的狀態轉移方程爲:blog
AC代碼ci
#include<iostream> #include<cstring> #include<algorithm> using namespace std; const int N = 1005; char s1[N]; char s2[N]; int dp[N][N]; int main() { cin >> s1 >> s2; int l1 = strlen(s1); int l2 = strlen(s2); int ans = 0; memset(dp, 0, sizeof(dp)); for (int i = 1; i <= l1; i++) { for (int j = 1; j <= l2; j++) { if (s1[i - 1] == s2[j - 1]) { dp[i][j] = dp[i - 1][j - 1] + 1; ans = max(ans, dp[i][j]); } } } cout << ans << endl; return 0; }