两个字符串寻找最长公共子串

描述:

打印两个字符串中,最长的公共子串。不考虑并列最长的公共子串。

如:传入str1 = "abcdef" 和 str2 = "bcdeyzcdef"

打印:"cdef"

思路:

从相对较短的字串中依次选择比上一次少一个字符的子串,然后,去较长的字串中查找(用strstr()函数)。

例如本题:

第一次:在str2中查找abcdef

第二次:在str2中查找abcde、bcdef

第三次:在str2中查找abcd、bcde、cdef

依次进行……

代码如下:

void printLongestPublicSubString(const char * str, const char * str2)
{
    //以下两个变量是为了保证我们总是从较短的字串中截取字串去较长字串中查找
    size_t len = (strlen(str) < strlen(str2))?strlen(str):strlen(str2);
    size_t flag = (strlen(str) < strlen(str2))?0:1;
    
    char * buf = (char *)malloc(sizeof(char) * len);
    
    for (size_t i = len; i > 0; i--)
    //该层循环控制从较短字串中截取的子串长度
    {
        memset(buf, 0, len);//每次查找都要清零,把之前赋的值清掉。
        for (size_t j = 0; j <= len - i; j++)
        //该层循环截取子串
        {
            for (size_t k = 0; k < i; k++)
            //将要截取的子串取出来
            {
                if (flag)
                    *(buf+k) = *(str2+j+k);
                else
                    *(buf+k) = *(str+j+k);
            }
            if (flag) {
                if (strstr(str, buf)) {
                    printf("%s\n",buf);
                    return;
                }
            }else{
                if (strstr(str2, buf)) {
                    printf("%s\n",buf);
                    return;
                }
            }
            
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值