最長公共子串問題

題目連接   講解連接  二維表思路  二維表思路與動規聯繫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,表示空字符串和另外一字符串的子串的最長公共子串。code

咱們先判斷A的第i個元素B的第j個元素是否相同,即判斷A[i - 1]和 B[j -1]是否相同,若是相同它就是dp[i - 1][j- 1] + 1,至關於在兩個字符串都去掉一個字符時的最長公共子串再加 1;不然最長公共子串取0。htm

相應的狀態轉移方程爲:blog

  • dp[i][0]=0,dp[0][j]=0
  • dp[i][j]=0,A[i1]!=B[j1]
  • dp[i][j]=dp[i1][j1]+1,A[i1]==B[j1]

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;
}
相關文章
相關標籤/搜索