原题链接:
描述:
查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。
注:子串的定义:将一个字符串删去前缀和后缀(也可以不删)形成的字符串。请和“子序列”的概念分开!
输入描述:
输入两个字符串
输出描述:
返回重复出现的字符
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
string str1,str2,lstr,sstr;
cin>>str1>>str2;
if(str1.size()>str2.size())
{
swap(str1,str2);
}
int n=str1.size();
int m=str2.size();
vector<vector<int>>dp(n+1,vector<int>(m+1,0));//创建动态数组
int max=0,maxi=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(str1[i-1]==str2[j-1])
{
dp[i][j]=dp[i-1][j-1]+1;
}
else
{
dp[i][j]=0;
}
if(dp[i][j]>max)
{
max=dp[i][j];
maxi=i-1;
}
}
}
string ans=str1.substr(maxi+1-max,max);
for(int i=0;i<ans.size();i++)
{
cout<<ans[i];
}
}
本文介绍了一种通过动态规划方法查找两个字符串中最长公共子串的算法,并提供了完整的C++实现代码。该算法适用于寻找两个字符串之间的最大相似度部分。
5532

被折叠的 条评论
为什么被折叠?



