Python 序列中不同子序列的错误解
我正在努力解决这个问题。问题是:给定一个字符串S和一个字符串T,计算S中T的不同子序列的数量 字符串的子序列是由 通过删除某些字符(可以是无字符)来创建原始字符串 不干扰其余字符的相对位置。 (即,“ACE”是“ABCDE”的子序列,而“AEC”不是) 下面是一个例子:S=“rabbit”,T=“rabbit” 答案应该是3Python 序列中不同子序列的错误解,python,algorithm,recursion,subsequence,Python,Algorithm,Recursion,Subsequence,我正在努力解决这个问题。问题是:给定一个字符串S和一个字符串T,计算S中T的不同子序列的数量 字符串的子序列是由 通过删除某些字符(可以是无字符)来创建原始字符串 不干扰其余字符的相对位置。 (即,“ACE”是“ABCDE”的子序列,而“AEC”不是) 下面是一个例子:S=“rabbit”,T=“rabbit” 答案应该是3 还有一个动态规划的解决方案,我知道通过创建一个矩阵。然而,我想知道这种递归方法哪里出了问题?目前它正在打印6,但答案应该是3。程序失败,因为它的逻辑似乎没有特别连接到解决问
还有一个动态规划的解决方案,我知道通过创建一个矩阵。然而,我想知道这种递归方法哪里出了问题?目前它正在打印6,但答案应该是3。程序失败,因为它的逻辑似乎没有特别连接到解决问题的算法。考虑到变量名只有一个字母,而且没有注释,我很难理解您的意图 如果I>=len(s)或j>=len(t),我确实理解语句:return——如果我们已经用完了任一字符串的末尾,请停止查找。 类似地,在适当的支持下,函数的后半部分也可以工作,但在这种情况下,它还不足以完成它的工作 我没有得到第一个if操作:您发现t是s的一个批发子字符串。计算一个子序列是正确的,但之后你就不再寻找了。你打算如何通过1级考试(“abababab”,“ab”)?找到第一个,数到1,然后完全退出。类似地,当你交给你一个测试用例时,它失败了,计算了太多的用例 我还用(“bababab”,“aa”)测试了这一点;它声称有25种解决方案,包括计算鬼魂和摸索指数前进。如果我去掉两端的“b”字符,它将计数为20。这应该是一个线索,你的终端计数 对于(“AAAAAA”、“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
这只是一个开始
如果您没有找到快速的解决方案,我建议您回到编写上述代码的伪代码。桌面在几个简单的案例上模拟算法,比如我提供的案例。确保基本递归步骤得到了干净的处理:
我认为你在最后一个问题上处理得很好,而你在第二个问题上就快到了。你离一个有效的解决方案不远;继续前进 非常奇怪的问题。这是否意味着T是S的子序列?否则怎么会是3?@JasonS:兔子可以用ra[bb]钻头或rab[bb]it或ra[b]b[b]it制造。[]用于显示选定的角色。明白了吗?是的,我想就是这样。不是“T的子序列”所表示的。在你的代码中,s和T永远不会改变。这是关于什么的?
def count_permute(self, s, t, i, j):
print "ENTER", \
"\ts=", s[i:], "; i=", i,\
"\tt=", t[j:], "; j=", j