Python 使用回溯时,如何可靠地跟踪答案?
我一直在尝试使用回溯来解决问题,但我在跟踪找到的答案方面遇到了问题 我的代码:Python 使用回溯时,如何可靠地跟踪答案?,python,recursion,backtracking,Python,Recursion,Backtracking,我一直在尝试使用回溯来解决问题,但我在跟踪找到的答案方面遇到了问题 我的代码: class Solution: def restore_ip(self, s): self.ans = [] self.backtrack([], s) return self.ans def backtrack(self, path, s): if s == "" and len(path) == 4:
class Solution:
def restore_ip(self, s):
self.ans = []
self.backtrack([], s)
return self.ans
def backtrack(self, path, s):
if s == "" and len(path) == 4:
#print(self.ans)
self.ans.append(path)
#print(self.ans)
return
if s == "" or len(path) >= 4:
return
for i in range(1, len(s)+1):
if i > 3:
break
if int(s[:i]) > 255:
break
if i != 1 and s[0] == 0:
break
path.append(s[:i])
self.backtrack(path, s[i:])
path.pop()
a = Solution()
print(a.restore_ip("25525511135"))
当我试着运行这段代码时,它输出了这样的内容:[[],[]
;
但我预料到了这一点:[[255]、[255]、[255]、[11]、[135]、[255]、[255]、[111]、[35]
;
当我在代码中取消对两个print()的注释时,它输出以下内容:
[['255', '255', '11', '135']]
[['255', '255', '111', '35'], ['255', '255', '111', '35']]
[[], []]
由此,我推断我的逻辑总体上是正确的,但是解决方案
类的ans
变量中存储的答案不知怎么搞砸了
有人能帮我解决这个问题吗
谢谢,祝你今天愉快 python通过引用传递参数,因此附加到
ans
和path.pop()的path
是对象
您需要复制指定给回溯的路径对象(path.copy()
在py3中,路径[:]
在py2中):
self.backtrack(path.copy(),s[i:]
^^^^^^^^^^^
您应该通过返回值跟踪解决方案的状态
找到解决方案后,返回True
并停止回溯
附言
您可以将方法转换为静态,因为答案与解决方案
对象状态无关,因此可以使用不同的线程解决多个问题
class Solution:
def restore_ip(self, s):
self.ans = []
self.backtrack([], s)
return self.ans
def backtrack(self, path, s):
if s == "" and len(path) == 4:
self.ans = path
return True
if s == "" or len(path) >= 4:
return False
for i in range(1, len(s)+1):
if i > 3:
break
if int(s[:i]) > 255:
break
if i != 1 and s[0] == 0:
break
path.append(s[:i])
if self.backtrack(path, s[i:]):
return True
path.pop()
a = Solution()
# ['255', '255', '11', '135']
print(a.restore_ip("25525511135"))