针对序列的不同子序列的错误解决方案

时间:2016-02-24 23:07:00

标签: python algorithm recursion subsequence

我正在努力解决this problem。问题是:给定字符串S和字符串T,计算S中T的不同子序列的数量。

  

字符串的子序列是一个由字符串组成的新字符串   通过删除一些(可以是无)字符来删除原始字符串   不会打扰其余角色的相对位置。   (即“ACE”是“ABCDE”的子序列,而“AEC”不是)。

     

这是一个例子:S =“rabbbit”,T =“rabbit”

     

答案应为3。

class permute:
    def __init__(self):
        self.count = 0

    def count_permute(self, s, t, i, j):
        print(i, j)
        if t in s:
            self.count += 1
            return
        if i >= len(s) or j >= len(t):
            return
        self.count_permute(s, t, i+1, j)
        if s[i] == t[j] and j == (len(t)-1):
            self.count += 1
            self.count_permute(s, t, i+1, j+1)
        else:
            self.count_permute(s, t, i+1, j+1)

    def print_count(self):
        print(self.count)

p = permute()
p.count_permute("rabbbit", "rabbit", 0, 0)
p.print_count()

还有动态编程解决方案,我知道通过创建矩阵。但是,我想知道这种递归方法在哪里出错?目前它正在打印6但答案应该是3。

1 个答案:

答案 0 :(得分:0)

程序失败,因为它的逻辑似乎与解决问题的算法没有特别的联系。考虑到单字母变量名称和缺少注释,我在确定您的意图时遇到了一些麻烦。

我理解声明如果i> = len(s)或j> = len(t):return - 如果我们已经离开任一字符串的末尾,退出看。 同样,在给予适当支持的情况下,函数的后半部分可以工作,但在这种情况下,它还不足以完成它的工作。

我没有获得第一个 if 操作:您发现 t s 的批发子字符串。计算一个子序列是正确的,但是你放弃了查找。你打算如何计划过去1(" abababab"," ab")?你找到第一个,计数1,然后完全退出。同样地,当递交一个测试用例时,它会失败,计算太多的情况。

我也用(" bababababab"," aa")对此进行了测试;它声称有25个解决方案,计算鬼魂并使索引进展无效。如果我删除' b'在两端的字符,它是20.这应该是你的终端计数的线索。

对于(" aacbaaa"," aba"),它会计算31次而不是实际的6次。

在当前代码中,您需要继续寻找初始匹配。您需要在此处进行两次递归调用(使用 j j + 1 )。您还需要限制搜索结束时的超额计数。

最后,我强烈建议进行一些基本的强力调试:print语句中的东西来跟踪例程的进度。跟踪进入和退出,参数值和返回条件。我插入了以下跟踪语句以帮助找到我的方式:

def count_permute(self, s, t, i, j):
    print "ENTER", \
        "\ts=", s[i:], "; i=", i,\
        "\tt=", t[j:], "; j=", j

这只是一个开始。

如果您没有找到快速解决方案,我建议您返回上面编写的伪代码。桌面模拟算法在几个简单的情况下,例如我提供的情况。确保您已完成基本的递归步骤干净地处理:

  1. 终止条件
  2. 检测案例
  3. 递归电话
  4. 我认为你对最后一个有一个不错的处理,而你几乎就在#2上了。你离工作解决方案不远了;继续堵塞!