您的位置:首页 > 其它

【ACM】华为oj---最长公共子串计算

2015-08-25 14:44 225 查看
题目描述:

计算两个字符串的最大公共字串的长度,字符不区分大小写详细描述:接口说明原型:int getCommonStrLength(char * pFirstStr, char * pSecondStr);输入参数:     char * pFirstStr //第一个字符串     char * pSecondStr//第二个字符串

输入:

输入两个字符串

输出:

一个整数

样例

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);

}


4000
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: