最长公共子串的递归解决方案出错

时间:2018-01-15 07:41:22

标签: c++ recursion substring dynamic-programming

问题:给定两个字符串'X'和'Y',找到最长公共子字符串的长度 我的解决方案一直在运行,并且没有达到基本条件。我不明白为什么会这样?

我已经看过DP解决方案,但在互联网上找不到令人满意的递归解决方案。

int lcs_calc(string str1, string str2, int i_1, int i_2, int lcs, int c_lcs)
{

    if (i_1 >= str1.length() || i_2 >= str2.length())
    {
        //end. base cond
        return lcs;
    }
    if (str1[i_1] == str2[i_2])
    {
        c_lcs++;
        if (c_lcs > lcs) lcs = c_lcs;
        return lcs_calc(str1, str2, ++i_1, ++i_2, lcs, c_lcs);
    }
    else
    {
        if (c_lcs == 0)
        {
            return max(lcs_calc(str1, str2, ++i_1, i_2, lcs, c_lcs), lcs_calc(str1, str2, i_1, ++i_2, lcs, c_lcs));
        }
        else
        {
            c_lcs = 0;
            return max(lcs_calc(str1, str2, --i_1, i_2, lcs, c_lcs), lcs_calc(str1, str2, i_1, --i_2, lcs, c_lcs));
        }


    }
}



初始参数:

str1 =“AABC”
str2 =“ABCD”

i_1 = 0(第一个字符串的索引)
i_2 = 0(第2串的索引)
c_lcs = 0(当前公共子串的长度)
lcs = 0(最长公共子串的长度)

2 个答案:

答案 0 :(得分:2)

return max(lcs_calc(str1, str2, ++i_1, i_2, lcs, c_lcs), lcs_calc(str1, str2, i_1, ++i_2, lcs, c_lcs));

在第一次调用中,只应增加i_1,并且在第二次调用中只应增加i_2。因为您使用++,会增加i_1在两个电话中。 您应该了解,在第一次通话中++i_1后,在lcs_calc() i_1的第二次通话中,会以增量值的形式传递,这不是您想要的。

你也不需要另一个案例。

else
{
 return max(lcs_calc(str1, str2, i_1+1, i_2, lcs, c_lcs), lcs_calc(str1, str2, i_1, i_2+1, lcs, c_lcs));
}

答案 1 :(得分:1)

令人惊讶的是,在递归调用函数时减少索引。由于索引在返回时会自动减少,因此不应该这样做。您应该继续增加一个索引,然后在字符不相同时继续增加另一个索引。

喜欢(专注于递归,而不是正确性):

if (length reached): return c_lcs
if same: lcs = rec(str1, str2, i1+1, i2+1, c_lcs)
lcs = max(lcs, rec(str1, str2, i1+1, i2, 0))
lcs = max(lcs, rec(str1, str2, i1, i2+1, 0))
return lcs;