zoukankan      html  css  js  c++  java
  • 算法面试-LeetCode-0093复原IP地址

     回溯(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
    
            
    
    仙衣眠云碧岚袍,一襟潇洒,两袖飘飘。玉墨舒心春酝瓢,行也逍遥,坐也逍遥。
  • 相关阅读:
    hdu 2222 Keywords Search
    Meet and Greet
    hdu 4673
    hdu 4768
    hdu 4747 Mex
    uva 1513 Movie collection
    uva 12299 RMQ with Shifts
    uva 11732 strcmp() Anyone?
    uva 1401
    hdu 1251 统计难题
  • 原文地址:https://www.cnblogs.com/max520liuhu/p/11025786.html
Copyright © 2011-2022 走看看