题目描述:输入两个字符串str1和str2,输出它们公共的最长子串,如果有多个结果,取较短字符串中从左到右最早出现的那个子串。请编程实现并在注释中简单描述算法思想。
输入: 输入数据为两个长度不同的字符串,每个字符串最大长度为1000
输出: 按照题目要求,输出一个字符串;若无公共子串,则输出为空
样例输入:
asd12345qwer
asdd1234_5qwerfff
样例输出:
d1234
这是一个动态规划的题目,刚好最近自己也在看这方面,把它复盘一下
#include<iostream>
#include<string>
#include<vector>
using namespace std;
void func(string str1, string str2)
{
int len1 = str1.length();
int len2 = str2.length();
int max = 0;
int end = 0;
vector<vector<int> > dp(len1 + 1, vector<int>(len2 + 1, 0));
for (int i = 1; i < len1; i++)
{
for (int j = 1; j < len2; j++)
{
if (str1[i - 1] == str2[j - 1])
{
dp[i][j] = dp[i - 1][j - 1] + 1;
}
if (dp[i][j] > max)
{
max = dp[i][j];
end = i;
}
}
}
cout << str1.substr(end - max, max) << endl;
}
int main()
{
string str1;
string str2;
getline(cin, str1);
getline(cin, str2);
func(str1, str2);
return 0;
}