【十二题解】 | #查找两个字符串a,b中的最长公共子串#
查找两个字符串a,b中的最长公共子串
http://www.nowcoder.com/practice/181a1a71c7574266ad07f9739f791506
#include<stdio.h>
int main(){
char data1[300]={0};
char data2[300]={0};
while(scanf("%s", data1) != EOF){
scanf("%s", data2);
int lenth1, lenth2;
for(lenth1=0; data1[lenth1] != '\0'; lenth1++);
for(lenth2=0; data2[lenth2] != '\0'; lenth2++);
int **dp=(int**)malloc(sizeof(int*)*(lenth1+1));
for(int i=0; i<lenth1+1; i++){
dp[i]=(int*)malloc(sizeof(int)*(lenth2+1));
for(int x=0; x<lenth2; x++)dp[i][x]=0;
}
int max = 0;
int loc1=0, loc2=0;
if(lenth1<lenth2){
for(int i=1; i<=lenth1; i++)
{
for(int j=1; j<=lenth2; j++){
if(data1[i-1]==data2[j-1]){
dp[i][j]=dp[i-1][j-1]+1;
if(dp[i][j]>max){
max = dp[i][j];
loc1=i;
loc2=j;
}
}
else{
dp[i][j]=0;
}
}
}
}
else{
for(int i=1; i<=lenth2; i++)
{
for(int j=1; j<=lenth1; j++){
if(data1[j-1]==data2[i-1]){
dp[j][i]=dp[j-1][i-1]+1;
if(dp[j][i]>max){
max = dp[j][i];
loc1=j;
loc2=i;
}
}
else{
dp[j][i]=0;
}
}
}
}
if(lenth1<lenth2){
int start = loc1-max;
for(; start<loc1; start++){
printf("%c", data1[start]);
}
}
else{
int start = loc2-max;
for(; start<loc2; start++){
printf("%c", data2[start]);
}
}
printf("\n");
}
}