题解 | #查找两个字符串a,b中的最长公共子串#

查找两个字符串a,b中的最长公共子串

http://www.nowcoder.com/practice/181a1a71c7574266ad07f9739f791506

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    char str1[308], str2[308], temp[308];
    scanf("%s%s", str1, str2);
    int len1 = strlen(str1), len2 = strlen(str2), i, j, commonlen = 0, index = -1, t, flag = 0;
    if(len2 < len1){
        strcpy(temp, str1);
        strcpy(str1, str2);
        strcpy(str2, temp);
        t = len1;
        len1 = len2;
        len2 = t;
    }
    int dp[len1][len2];
    memset(dp, 0, sizeof(int) * len1 * len2);
    for(i = 0; i < len1; i++){
        if(str1[i] == str2[0]){
            dp[i][0] = 1;
            if(dp[i][0] > commonlen){
                commonlen = 1;
                index = i;
            }
        }
    }
    for(i = 0; i < len2; i++){
        if(str2[i] == str1[0]){
            dp[0][i] = 1;
            if(commonlen == 0){
                commonlen = 1;
                flag = 1;
            }
        }
    }
    for(i = 1; i < len1; i++){
        for(j = 1; j < len2; j++){
            if(str1[i] == str2[j]){
                dp[i][j] = dp[i-1][j-1] + 1;
                if(dp[i][j] > commonlen){
                    commonlen = dp[i][j];
                    index = i;
                }
            }
        }
    }
    if(flag == 1 && commonlen == 1){
        printf("%c", str1[0]);
    }
    else{
        if (index >= 0){
            for(i = index - commonlen + 1; i <= index; i++){
                printf("%c", str1[i]);
            }
        }
    }
    printf("\n");
    return 0;
}

全部评论

相关推荐

头像
11-21 11:39
四川大学 Java
是红鸢啊:忘了还没结束,还有字节的5k 违约金
点赞 评论 收藏
分享
斑驳不同:还为啥暴躁 假的不骂你骂谁啊
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务