码迷,mamicode.com
首页 > 编程语言 > 详细

算法面试-LeetCode-0093复原IP地址

时间:2019-06-14 23:38:40      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:result   现在   完成后   backtrack   否则   add   更新   删除   列表   

 回溯(DFS)
这是一个回溯函数backtrack(prev_pos = -1, dots = 3) 的算法,该函数使用上一个放置的点 prev_pos 和待放置点的数量 dots 两个参数 :

遍历三个有效位置curr_pos 以放置点
    检查从上一个点到现在点中间的部分是否有效 :
    是 :
        放置该点。
        检查全部 3个点是否放好:
                是 :
                    将结果添加到输出列表中。
                否 :
                    继续放下一个点 backtrack(curr_pos, dots - 1)。
        回溯,移除最后一个点


class RestoreIpAddress(object):

    def __init__(self, s):
        """
        output为最终符合要求的列表
        segments为存储符合要求的截取部分的列表
        """
        self._s = s
        self.length = len(s)
        self.output, self.segments = [], []

    def is_valid(self, segment):
        """
        1. 截取的部分的整数必须小于或者等于255
        2. 截取部分除非是0否则不可以以0开头
        3. 返回bool
        """
        return int(segment) <= 255 if segment[0] != '0' else len(segment) == 1

    def update_output(self, curr_pos):
        """
        :param curr_pos:
        :return:
        """
        # 最后一个点放置完成后,针对剩余截取部分是curr_pos+1开始
        segment = self._s[curr_pos + 1:self.length]
        # 判断最后剩余部分是否符合
        if self.is_valid(segment):
            self.segments.append(segment)
            print(self.segments)
            self.output.append(".".join(self.segments))
            # 将最后部分删除,然后移动curr_pos,这里需要很好的理解递归
            self.segments.pop()
        # 最后一部分验证不合格,则最为一种递归出口

    def backtrack(self, pre_pos=-1, dots=3):
        """
        1. 有限制条件可知,'.'符号不可以放在头部或尾部之后或者距离上一个'.'三个字符以上,
        所以range(pre_pos + 1, min(self.length - 1, pre_pos + 4))

        """
        for curr_pos in range(pre_pos + 1, min(self.length - 1, pre_pos + 4)):
            segment = self._s[pre_pos + 1:curr_pos + 1]
            if self.is_valid(segment):
                self.segments.append(segment)
                # 这个点为最后一个点则判断是output否可以更新
                if dots - 1 == 0:
                    self.update_output(curr_pos)
                else:
                    # 递归,尝试放入下一个"."
                    self.backtrack(curr_pos, dots - 1)
                # 1. 当update_output中最后一部分验证失败时,回溯时删除截取的部分
                # 2. 在backtrack中验证失败,回溯时,删除截取的部分
                self.segments.pop()

    def result(self):
        self.backtrack()
        return self.output

        

算法面试-LeetCode-0093复原IP地址

标签:result   现在   完成后   backtrack   否则   add   更新   删除   列表   

原文地址:https://www.cnblogs.com/max520liuhu/p/11025786.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!