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"))