2016复旦大学计算机复试上机——第一题(求两个字符串的最大公共子串简单DP)
思路1:暴力求解;两重for循环。
思路2:简单dp问题,推导出dp表达式,i,j分别为字符串A,B的当前访问的元素下
标
若A[i] == B[j]; 则dp[i][j] = dp[i-1][j-1] +1;
若不等 , dp[i][j] = 0;
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
int dp[1010][1010];
int main()
{
string a,b;cin>>a>>b;
a ="0"+a; b = "0"+b; // +0为了让下标从1开始递推
int n =a.length();int m=b.length();
for(int i=0;i<=n;i++) //边界为0
{
dp[i][0]=0;
}
for(int j=0;j<=m;j++)
{
dp[0][j]=0;
} int res=0;
for(int i=1;i<n;i++)
{
for(int j=1;j<m;j++)
{
if(a[i] == b[j])
dp[i][j] = dp[i-1][j-1]+1;
else
dp[i][j] = 0;
res = max(res,dp[i][j]);
}
}
printf("%d\n",res);
return 0;
}