35、编程实现:找出两个字符串中最大公共子字符串,如"abccade","dgcadde"的最大子串为
"cad"
/*
35、编程实现:找出两个字符串中最大公共子字符串,如"abccade","dgcadde"的最大子串为
"cad"
不同于56的最长公共子串
DP题算法导论上有:
c[i,j]=0 i=0||j=0
=c[i-1,j-1]+1 a[i]==a[j]
=max(c[i-1,j],c[i,j-1]) a[i]!=a[j]
本题 就是循环枚举
*/
#include<iostream>
#include<stdio.h>
#include<cmath>
#include<algorithm>
using namespace std;
int GetCommon(char s1[], char s2[])
{
int len1=strlen(s1);
int len2=strlen(s2);
int r,maxlen=0;
for(int i=0;i<len1;i++)
{
for(int j=0;j<len2;j++)
{
if(s1[i]==s2[j])
{
int as=i,bs=j,count=1;
while(as+1<len1&&bs+1<len2 &&s1[++as]==s2[++bs])
count++;
if(count>maxlen)
{
maxlen = count;
r=i;
}
}
}
}
for(int i=r;i<r+maxlen;i++)
printf("%c",s1[i]);
printf("\n");
return maxlen;
}
int main()
{
char a[]={"abccade"};
char b[]={"dgcadde"};
printf("%s和%s的最长公共子串是:\n",a,b);
printf("长度为:%d\n",GetCommon(a,b));
return 0;
}