我正在努力解决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。
答案 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
这只是一个开始。
如果您没有找到快速解决方案,我建议您返回上面编写的伪代码。桌面模拟算法在几个简单的情况下,例如我提供的情况。确保您已完成基本的递归步骤干净地处理:
我认为你对最后一个有一个不错的处理,而你几乎就在#2上了。你离工作解决方案不远了;继续堵塞!