Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 序列中不同子序列的错误解_Python_Algorithm_Recursion_Subsequence - Fatal编程技术网

Python 序列中不同子序列的错误解

Python 序列中不同子序列的错误解,python,algorithm,recursion,subsequence,Python,Algorithm,Recursion,Subsequence,我正在努力解决这个问题。问题是:给定一个字符串S和一个字符串T,计算S中T的不同子序列的数量 字符串的子序列是由 通过删除某些字符(可以是无字符)来创建原始字符串 不干扰其余字符的相对位置。 (即,“ACE”是“ABCDE”的子序列,而“AEC”不是) 下面是一个例子:S=“rabbit”,T=“rabbit” 答案应该是3 还有一个动态规划的解决方案,我知道通过创建一个矩阵。然而,我想知道这种递归方法哪里出了问题?目前它正在打印6,但答案应该是3。程序失败,因为它的逻辑似乎没有特别连接到解决问

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

字符串的子序列是由 通过删除某些字符(可以是无字符)来创建原始字符串 不干扰其余字符的相对位置。 (即,“ACE”是“ABCDE”的子序列,而“AEC”不是)

下面是一个例子:S=“rabbit”,T=“rabbit”

答案应该是3


还有一个动态规划的解决方案,我知道通过创建一个矩阵。然而,我想知道这种递归方法哪里出了问题?目前它正在打印6,但答案应该是3。

程序失败,因为它的逻辑似乎没有特别连接到解决问题的算法。考虑到变量名只有一个字母,而且没有注释,我很难理解您的意图

如果I>=len(s)或j>=len(t),我确实理解语句:return——如果我们已经用完了任一字符串的末尾,请停止查找。 类似地,在适当的支持下,函数的后半部分也可以工作,但在这种情况下,它还不足以完成它的工作

我没有得到第一个if操作:您发现ts的一个批发子字符串。计算一个子序列是正确的,但之后你就不再寻找了。你打算如何通过1级考试(“abababab”,“ab”)?找到第一个,数到1,然后完全退出。类似地,当你交给你一个测试用例时,它失败了,计算了太多的用例

我还用(“bababab”,“aa”)测试了这一点;它声称有25种解决方案,包括计算鬼魂和摸索指数前进。如果我去掉两端的“b”字符,它将计数为20。这应该是一个线索,你的终端计数

对于(“AAAAAA”、“aba”),它统计了31次事件,而不是实际的6次

在当前代码中,您需要在找到初始匹配后继续查找。这里需要两个递归调用(使用jj+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