• 算法面试-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
    
            
    
    仙衣眠云碧岚袍,一襟潇洒,两袖飘飘。玉墨舒心春酝瓢,行也逍遥,坐也逍遥。
  • 相关阅读:
    python标准库学习-SimpleHTTPServer
    迁移cnblog博客
    zabbix监控使用
    20 个 OpenSSH 最佳安全实践
    编写基本的 udev 规则
    Linux.Siggen.180
    在 CentOS 7.0 上安装配置 Ceph 存储
    常用 GDB 命令中文速览
    Kubernetes TLS认证
    音乐下载api
  • 原文地址:https://www.cnblogs.com/max520liuhu/p/11025786.html
Copyright © 2020-2023  润新知