HJ65 查找两个字符串a,b中的最长公共子串(一把过)

描述
查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。
注:子串的定义:将一个字符串删去前缀和后缀(也可以不删)形成的字符串。请和“子序列”的概念分开!

本题含有多组输入数据!
输入描述:
输入两个字符串

输出描述:
返回重复出现的字符
示例1
输入:
abcdefghijklmnop
abcsafjklmnopqrstuvw

输出:
jklmnop
#include 
#include 

#if 0
#define dbg printf
#else
#define dbg 
#endif

int main(void)
{
    char str1[1024] = {0};
    char str2[1024] = {0};
    char longer[1024] = {0};
    char shorter[1024] = {0};
    char test[1024] = {0};
    int len, len1, len2;
    int max;
    int i;
    
    while(scanf("%s", str1) != EOF)
    {
        scanf("%s", str2);
        len1 = strlen(str1);
        len2 = strlen(str2);
        
        if(len1 < len2)
        {
            len = len1;
            strncpy(longer, str2, strlen(str2));
            strncpy(shorter, str1, strlen(str1));
        }
        else
        {
            len = len2;
            strncpy(longer, str1, strlen(str1));
            strncpy(shorter, str2, strlen(str2));
        }
        dbg("(%d):longer=(%s)\n", __LINE__, longer);
        dbg("(%d):shorter=(%s)\n", __LINE__, shorter);
        
        max = len;
        for(max=len; max>0; max--)
        {
            for(i=0; i<=len-max; i++)
            {
                memset(test, 0, sizeof(test));
                strncpy(test, shorter+i, max);
                dbg("(%d):test=(%s)\n", __LINE__, test);
                if(strstr(longer, test) != NULL)
                {
                    goto PRINT;
                }
            }
        }
PRINT:
        printf("%s\n", test);
        memset(test, 0, sizeof(test));
        memset(str1, 0, sizeof(str1));
        memset(str2, 0, sizeof(str2));
        memset(longer, 0, sizeof(str1));
        memset(shorter, 0, sizeof(str2));
    }
}

你可能感兴趣的:(hwjs,c语言,算法,数据结构)