动态规划——最大公共子串

定义一个二维的数组并做行列初始化:

 vector<vector<int>> dp(10, vector<int>(20,0))
题目:

给定两个只包含小写字母的字符串,计算两个字符串的最大公共子串的长度。
注:子串的定义指一个字符串删掉其部分前缀和后缀(也可以不删)后形成的字符串。

示例

输入:
asdfas
werasdfaswer
输出:
6

解题方法:动态规划

当s1[i-1] == s2[j-1] 时,dp[i][j] = dp[i - 1][j - 1] + 1
含义是,从中心展开,从里到外的数据都相等,最后才相等。所以迭代的判断条件是,s1[i-1] == s2[j-1]而不是s1[i] == s2[j]

代码
#include <iostream>
#include<string>
#include<vector>
using namespace std;

int main() {
    string st1, st2;
    cin >> st1;
    cin >> st2;
    int m = st1.size();
    int n = st2.size();
    int max_len = 0;
    vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
    for (int i = 1; i <= m; ++i) {
        for (int j = 1; j <= n; ++j) {
            if (st1[i-1] == st2[j-1]) {
                dp[i][j] = dp[i - 1][j - 1] + 1;
            }
            if (dp[i][j] > max_len) {
                max_len = dp[i][j];
            }
        }
    }
    cout << max_len << endl;
    return 0;
}
posted @ 2023-05-31 15:42  水水滴答  阅读(18)  评论(0编辑  收藏  举报