题目描述:
输入:
输入两个字符串
输出:
一个整数
样例
asdfas
werasdfaswer
6
分析:计算最长公共子串,区别于最长公共子序列,子串要求位置是连续的。同样利用动态规划的思想。用一个二维数组c[][]来记录两个串的情况,
转移方程为:
如果s1[i]==s2[j],则c[i][j]=c[i-1][j-1]+1
如果s1[i]!=s2[j],则c[i][j]=0
但是要注意一点,本题中不区分大小写,所以上述方程改为
如果s1[i]==s2[j] || abs(s1[i]-s2[j])==32,则c[i][j]=c[i-1][j-1]+1
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <stdlib.h>
#define MAX_N 500
using namespace std;
int LCS(char *s1,char *s2)
{
int len1,len2,i,j,maxlen=0;
int c[MAX_N][MAX_N]={0};
len1=strlen(s1);
len2=strlen(s2);
for(i=1;i<len1+1;i++)
{
for(j=1;j<len2+1;j++)
{
if(s1[i-1]==s2[j-1]||(abs(s1[i-1]-s2[j-1])==32))
{
c[i][j]=c[i-1][j-1]+1;
}
if(c[i][j]>maxlen)
maxlen=c[i][j];
}
}
return maxlen;
}
int main()
{
freopen("in.txt","r",stdin);
char str1[MAX_N],str2[MAX_N];
scanf("%s",str1);
scanf("%s",str2);
int LCSlen;
LCSlen=LCS(str1, str2);
printf("%d\n",LCSlen);
}