【十二题解】 | #查找两个字符串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");
}

}

全部评论

相关推荐

10-30 23:23
已编辑
中山大学 Web前端
去B座二楼砸水泥地:这无论是个人素质还是专业素质都👇拉满了吧
点赞 评论 收藏
分享
牛客279957775号:铁暗恋
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务