Python:可以打印答案,但不能返回答案(回文分区)

Python:可以打印答案,但不能返回答案(回文分区),python,Python,在下面的Python代码中,当我输入s=ab时,我得到[[],我应该得到[[a,b]]。我已经分别检查了这两个函数,结果证明它们是正确的。我甚至可以在第26行打印出答案[[a,b]],但我无法从return中获得答案。我在这里很困惑,我很感激任何能帮助我的想法 class Solution: # @param s, a string # @return a list of lists of string def partition(self, s): ##

在下面的Python代码中,当我输入s=ab时,我得到[[],我应该得到[[a,b]]。我已经分别检查了这两个函数,结果证明它们是正确的。我甚至可以在第26行打印出答案[[a,b]],但我无法从return中获得答案。我在这里很困惑,我很感激任何能帮助我的想法

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()
您正在递归调用之间共享临时值:

temp.append(stack[start][i])
self.dfs(temp, stack, start+len(stack[start][i]), end)
temp.pop()
temp引用的列表对象将附加到self.result:

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

您想附加一个副本:

你真的不需要临时工。只需构建新列表即可:

for item in stack[start]:
    self.dfs([item], stack, start + len(item), end)
您只需在临时文件中添加一个项目,然后再次删除它;从一个空的临时列表开始,这意味着您也可以为递归调用构建新的列表对象


不要在一个范围内循环然后索引,只需直接在堆栈[start]上循环即可。

我认为在函数dfs中,self.result.appendtemp会获取对象内的[[a,b]],因此当我在分区中返回self.result时,它应该是[[a,b]],但实际上会获取[[]。这里有什么问题吗?@frostnational:self.result设置好了,这就是分区返回的结果。谢谢你的回答,不过我需要一些时间来理解它。我认为对于最后一个递归调用,它是dfs[a,b],stack,2,2,所以当它运行时,self.result.appendtemp应该总是使self.result[[a,b]]成为self.result,不是吗?当我打印self.result时,它是正确的。为什么它在函数分区中不正确?@jasonccc:然后你的函数返回,temp仍然引用相同的嵌套列表对象。感谢添加注释。我现在明白了。我需要索引I,因为在“start+lenstack[start][I]”中有一个I,但是你说的这一点非常有意义@对不起,忘了一份推荐信。堆栈[start][i]被项替换。
if start == end:
    self.result.append(temp[:])
for item in stack[start]:
    self.dfs([item], stack, start + len(item), end)