详情: | 请找出两个字符串的最长公共子串,例如hello 和 error 的最长公共子串是eo |
http://bbs.codeaha.com/problem-12196.html\
这题我用两种方法:1,普通dfs, 2.记忆化dfs.
1.普通dfs:
#include <cstdio>
#include <cstring>
#include <algorithm>
char a[1009],b[1009];
using namespace std;
int dfs(int x,int y)
{
if(x==0 || y==0)
{
return 0;
}
if(a[x]==b[y])
{
return dfs(x-1,y-1)+1;
}
else
{
return max(dfs(x-1,y),dfs(x,y-1));
}
}
int main()
{
int n,m,i,j;
scanf("%s",a);
scanf("%s",b);
n=strlen(a);
m=strlen(b);
for(i=n;i>=1;i--)
{
a[i]=a[i-1];
}
a[n+1]='\0';
for(i=n;i>=0;i--)
{
b[i]=b[i-1];
}
b[m+1]='\0';
printf("%d",dfs(n,m));
return 0;
}
2.记忆化dfs:
#include <cstdio>
#include <cstring>
#include <algorithm>
char a[1009],b[1009],z[1009],book,f[1009][1009]={0};
using namespace std;
int dfs(int x,int y)
{
if(f[x][y] == -1)
{
if(a[x]==b[y])
{
f[x][y]=dfs(x-1,y-1)+1;
}
else
{
f[x][y]=max(dfs(x-1,y),dfs(x,y-1));
}
}
return f[x][y];
}
int main()
{
int n,m,i,j;
scanf("%s",a);
scanf("%s",b);
n=strlen(a);
m=strlen(b);
for(i=1;i<=1008;i++)
for(j=1;j<=1008;j++)
f[i][j]=-1;
for(i=n;i>=1;i--)
{
a[i]=a[i-1];
}
a[n+1]='\0';
for(i=n;i>=0;i--)
{
b[i]=b[i-1];
}
b[m+1]='\0';
printf("%d",dfs(n,m));
return 0;
}