LeetCode:复原IP地址

1. 题目描述

给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。

示例:

输入: “25525511135”
输出: [“255.255.11.135”, “255.255.111.35”]

2. 思路

第一种方法就是暴力枚举,将**.**所有可能放的位置全部列举出来,然后在挑选符合的放法,太复杂,不考虑
第二种方法就是回溯法:完整思路,在代码中说。

2.1 代码

class Solution:
    def restoreIpAddresses(self, s: str) -> List[str]:
        def isValid(segment):  
        # 检查前一点和当前点中间位置的字符是否符合ip地址段的要求
            return int(segment) <= 255 if segment[0] != '0' else len(segment) == 1
        def updateOutput(curPos):
        # 当三个点都有位置的时候,检查最后形成的ip地址段是否符合规则。
            segment = s[curPos+1:n]
            if isValid(segment):  # 如果符合,更新最后的结果
                segments.append(segment)
                outPut.append(".".join(segments))
                segments.pop()  # 将最后形成的地址段删除,进行回溯
        def backTrack(prevPos = -1, dotNum = 3):
            """ prevPos表示之前一个点的位置。 dotNum表示目前还有几个点没有进行安放。 """
            for curPos in range(prevPos+1,min(n-1,prevPos+4)):  
            """ 当前的点放的位置肯定是在前一点位置的后面1、2、3位(prevPos+1,prevPos+3)。 点不能放在最后的位置因此要考虑n-1和prevPos+4的最小值。 """
                segment = s[prevPos + 1:curPos + 1] 
                if isValid(segment): 
                """ 如果当前的地址段可行,在这个地址段的基础上进行下面的操作, 如果不行,试下一个位置 """
                    segments.append(segment)###############
                    if dotNum - 1 == 0:  
                    # 如果dotNum-1==0,那么就说明三个点都已经放完了,
                    # 更新outPut
                        updateOutput(curPos)
                    else:
                    # 如果没放完,在当前位置的基础上,继续放下一个点
                        backTrack(curPos,dotNum - 1)
                    segments.pop()##############
                    # 当前点在当前位置上的情况都事过之后,
                    # 将之前存入的地址段删除,继续往上回溯
        segments = []
        n = len(s)
        outPut = []
        backTrack()
        return outPut

你可能感兴趣的:(leetcode)