一、最长公共子串问题
s1: abcde
s2: abgde
输出2
相对于最长公共子序列问题,最长公共子串问题的特点就是寻找连续的最长子序列。这里处理方法是生成二维dp数组。最长连续子串的长度res。dp数组表示相等则+1,遇见不等字符则置0,再遇见相等从新从0开始+1.
若s1[i-1]=s2[j-1]
i>1&&j>1 dp[i][j] = dp[i-1][j-1]+1;//当前字符不是起始字符,则累加1
i==1||j==1 dp[i][j] = 1;//i或j是起始字符且s1 =s2,此时 dp[i][j] = 1
res = max(res,dp[i][j]);
若s1[i-1]!=s2[j-1]
dp[i][j] = 0;//因为当前字符不相等,
C++代码如下:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
string s1,s2;
getline(cin,s1);
getline(cin,s2);
int n1=s1.size(),n2=s2.size();
vector<vector<int>> dp(n1+1,vector<int>(n2+1,0));
int res = 0;
for(int i=1;i<=n1;i++)
{
for(int j=1;j<=n2;j++)
{
if(s1[i-1]==s2[j-1])
{
if(i>1&&j>1)
dp[i][j] = dp[i-1][j-1]+1;
else
dp[i][j] = 1;
res = max(res,dp[i][j]);
}else{
dp[i][j] = 0;
res = max(res,dp[i][j]);
}
}
}
cout<<res<<endl;
return 0;
}