Python:可以打印答案但不能回答(Palindrome Partitioning)

时间:2014-06-24 17:07:49

标签: python

在下面的Python代码中,当我输入s = "ab"时,我得到[[]],我应该[["a","b"]]。我已经单独检查了两个功能,结果证明是正确的。我甚至可以在第26行打印出答案[["a","b"]],但我无法从回复中得到答案。我在这里很困惑,我感谢任何有用的想法。

class Solution:
    # @param s, a string
    # @return a list of lists of string
    def partition(self, s):
        ############### Depth First Search: Usually we will use RECURSION a!!!
        if s == "":
            return [[]]
        if len(s) == 1:
            return [[s[0]]]
        self.result = []
        temp = []
        stack = [] # stack is a 2D lists
        for k in range(len(s)):
            stack.append([])
        for i in range(len(s)):
            for j in range(i+1,len(s)+1):
                substr = s[i:j]
                if substr == substr[::-1]:
                    stack[i].append(s[i:j])
        self.dfs(temp, stack, 0, len(s))
        return self.result

    def dfs(self, temp, stack, start, end):
        if start == end:
            self.result.append(temp)
            print(self.result)
            return
        else:
            for i in range(len(stack[start])):
                temp.append(stack[start][i])
                self.dfs(temp, stack, start+len(stack[start][i]), end)
                temp.pop()

1 个答案:

答案 0 :(得分:0)

您在递归调用之间共享temp

temp.append(stack[start][i])
self.dfs(temp, stack, start+len(stack[start][i]), end)
temp.pop()

temp引用的列表对象附加到self.result

if start == end:
    self.result.append(temp)

但是在返回后通过弹出再次清空该共享列表对象。这会在您打印之后从共享列表对象中删除元素。

您想要添加副本

if start == end:
    self.result.append(temp[:])

你真的需要 temp。只需构建新列表:

for item in stack[start]:
    self.dfs([item], stack, start + len(item), end)

您永远不会将一件商品添加到temp,然后再将其删除;从空的temp列表开始,这意味着您也可以为递归调用构建新的列表对象。

而不是循环range()然后编制索引,而只是直接遍历stack[start]