题目
给出两个字符串 a b
求这两个字符串的最长公共子串
思路
首先要明白 什么是子串
- 子串不同于子序列,子序列必须是联系的,而子串不必连续,但是前后顺序不能变 比如 abcd 子串可以是 a 、b、c、d、ac、ad 等 但不能是da
- 动态规划求解
- 首先定义dp[][]数组的含义 ,我们定义为dp[i][j] 的含义为 长度为i的a字符串与长度为j的b字符串的最长公共子串长度为dp[i][j]
- 写出转移方程
- 当 a[i]==b[j] 时 dp[i][j]=dp[i-1][j-1]+1;
- 否则 dp[i][j]=max(dp[i-1][j]+1,dp[i][j-1]+1)
代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[1010][2010];
char a[1010],b[1010];
int main()
{
//1 定义数组含义 dp[i][j]为 a的长度为i b的长度为j 的最长公共子串的长度
//2 关系 当a【i】==b【j】时 dp【i】【j】=dp【i-1】【j-1】+1
// else 把a末尾的去掉一个 或者把b末尾的去掉一个 求他们的最长公共子串的长度 再加一
//3 初始化 dp【0】【0】=0
int i,j,n,m,l1,l2;
while(~scanf("%s",a))
{
scanf("%s",b);
// printf("%s\n",a);
memset(dp,0,sizeof(dp));
l1=strlen(a);
l2=strlen(b);
for(i=0; i<l1; i++)
{
for(j=0; j<l2; j++)
{
if(a[i]==b[j])
dp[i+1][j+1]=dp[i][j]+1;
else
dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]);
// printf("%d\n",dp[i][j]);
}
}
printf("%d\n",dp[l1][l2]);
}
}