GeeksforGeeks 1439 Longest Common Substring

来源:互联网 发布:ubuntu 12 万m光口 编辑:程序博客网 时间:2024/05/21 09:33

题目
教程

求两个字符串的最长公共子串
DP
dp[i][j] 表示 X[0..i]到 Y[0..j]中的最长后缀长度
显然如果 x[i - 1] != Y[j - 1] 那么后缀就不相同了 所以是0
不然就是 dp[i - 1][j - 1] + 1
所有子串的最大相同后缀就是最大相同字串

#include <bits/stdc++.h>using namespace std;int LCSubstring(int A, int B, string X, string Y){    vector<vector<int> >  dp;    dp.resize(A + 1);    int ret = 0;    for (int i = 0; i <= A; i++) {        dp[i].resize(B + 1);        for (int j = 0; j <= B; j++) {            if (i == 0 || j == 0) continue;            if (X[i - 1] == Y[j - 1]) {                dp[i][j] = dp[i - 1][j - 1] + 1;                ret = max(ret, dp[i][j]);            }        }    }    return ret;}void solve(){    int A, B;    scanf("%d%d\n", &A, &B);    string X, Y;    getline(cin, X);    getline(cin, Y);    cout << LCSubstring(A, B, X, Y) << endl;}int main(){    //freopen("in", "r", stdin);    int T;    scanf("%d\n", &T);    while (T--) {        solve();    }}
0 0