在下面的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()
答案 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]
。