难以用递归代码解决这个问题

时间:2013-12-07 12:55:40

标签: recursion python-3.x

我需要找到最长公共子序列的长度。

stStringnm是他们的长度。我想写一个递归代码。

这是我到目前为止所做的,但我无法取得任何进展:

def lcs_len_v1(s, t):
    n = len(s)
    m = len(t)
    return lcs_len_rec(s,n,t,m)

def lcs_len_rec(s,size_s,t,size_t):
    cnt= 0
    if size_s==0 or size_t==0:
        return 0
    elif s[0]==t[0]:
        cnt= +1
    return cnt,  lcs_len_rec(s[1:], len(s[1:]), t[1:], len(t[1:]))

3 个答案:

答案 0 :(得分:1)

这有效:

def lcs(xstr, ystr):
    if not xstr or not ystr:
        return ""
    x, xs, y, ys = xstr[0], xstr[1:], ystr[0], ystr[1:]
    if x == y:
        return x + lcs(xs, ys)
    else:
        return max(lcs(xstr, ys), lcs(xs, ystr), key=len)

print(lcs("AAAABCC","AAAACCB"))  
# AAAACC

你应该知道递归方法只适用于相对微不足道的字符串; complexity随着字符串的增加而迅速增加。

答案 1 :(得分:1)

这是我的代码,如何在其上使用memoization技术?

def lcs_len_v1(s, t):
n = len(s)
m = len(t)
return lcs_len_rec(s,n,t,m)

def lcs_len_rec(s,size_s,t,size_t):
    if size_s==0 or size_t==0:
        return 0
    elif s[0]==t[0]:
        cnt=0
        cnt+= 1
        return cnt+ lcs_len_rec(s[1:], size_s-1, t[1:], size_t-1)
    else:
        return max(lcs_len_rec(s[1:], size_s-1, t, size_t), lcs_len_rec(s, size_s, t[1:], size_t-1))

答案 2 :(得分:0)

使用memoization技术,您也可以使用非常长的字符串运行算法。事实上它只是O(n ^ 2):

def recursiveLCS(table, s1, s2):
    if(table[len(s1)][len(s2)] != False):
        return table[len(s1)][len(s2)]
    elif len(s1) == 0 or len(s2) == 0:
        val = ""
    elif s1[0] == s2[0]:
        val = s1[0] + recursiveLCS(table, s1[1:], s2[1:])
    else:
        res1 = recursiveLCS(table, s1[1:], s2)
        res2 = recursiveLCS(table, s1, s2[1:])
        val = res2
        if len(res1) > len(res2):
            val = res1
    table[len(s1)][len(s2)] = val
    return val

def computeLCS(s1, s2):
    table = [[False for col in range(len(s2) + 1)] for row in range(len(s1) + 1)]
    return recursiveLCS(table, s1, s2)

print computeLCS("testistest", "this_is_a_long_testtest_for_testing_the_algorithm")

输出:

teststest