动态规划——最大公共子串
定义一个二维的数组并做行列初始化:
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;
}
作者:水水滴答
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。