最长公共序列Python递归函数的长度

时间:2015-02-06 15:12:22

标签: python longest-substring

我试图在python中使用递归来实现这个函数,我有一个错误。我无法理解这是什么错误,你能帮助我吗?

代码:

def LongestCommonSubsequence(X,Y,tailX,tailY):
    if tailX == tailY and tailX!='' and (X=='' or Y==''):
            return len(tailX)
    elif X=='' or Y=='':
            return 0
    else:

        return max( LongestCommonSubsequence(X[1:],Y[1:],tailX+X[0],tailY+Y[0]),
                    LongestCommonSubsequence(X[1:],Y[1:],tailX+X[0],tailY),
                    LongestCommonSubsequence(X[1:],Y[1:],tailX,tailY+Y[0]),
                    LongestCommonSubsequence(X[1:],Y[1:],tailX,tailY)) 

X=raw_input() 
Y=raw_input() 
print LongestCommonSubsequence(X,Y,'','')

输入:

abccdabab 
bacdbeb 

预期产量:5
我得到了什么:4

1 个答案:

答案 0 :(得分:2)

您似乎在尝试优化常见的尾部字符串;如果两个字符串以相同的尾部结尾,则确实可以跳过一些递归步骤。

但是你实际上并没有构建一个尾巴,而是在构建 head ,即开头的角色。

这是一个没有优化的工作递归llcs

def llcs(xstr, ystr):
    if not xstr or not ystr:
        return 0
    x, xtail, y, ytail = xstr[0], xstr[1:], ystr[0], ystr[1:]
    if x == y:
        return 1 + llcs(xtail, ytail)
    return max(llcs(xstr, ytail), llcs(xtail, ystr))

通过比较从xstrystr而不是的开头删除字符所找到的长度,可以找到最长的公共子字符串长度。

您的代码明确地从未将XY[1:]X[1:]Y配对,以进行max()调用,因此您永远不会为此找到LCS XY中的特定起始字符。

然后,您可以通过查看xtailytail(实际尾巴)尝试优化并提前纾困:

def llcs(xstr, ystr):
    if not xstr or not ystr:
        return 0
    x, xtail, y, ytail = xstr[0], xstr[1:], ystr[0], ystr[1:]
    if x == y:
        if xtail == ytail:
            # if the tails match, bail out early
            return 1 + len(xtail)
        return 1 + llcs(xtail, ytail)
    return max(llcs(xstr, ytail), llcs(xtail, ystr))