LeetCode93-复原IP地址

复原IP地址

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

示例:

["255.255.11.135", "255.255.111.35"]

思路:

这道题目描述的很简单,用到的方法也是我们比较熟悉的回溯法。

关于此题,我觉得只要抓住三点即可。

  1. 给定的IP 地址总长度必须要不小于4,不超过12。比如1.1.1.1以及255.255.255.255
  2. 给定的IP 地址肯定是要分成4个部分的,每个部分子串的长度不超过3,并且该子串值的大小在[0, 255]之间。
  3. 还有一种特殊情况,就是字串中包含0。比如“010010”这种情况,该IP 地址对应的标准地址为["0, 100, 1, 0", "0, 10, 0, 10"]也就是0不能省略了,即切割完的IP地址长度与原地址长度相等

理解了这三点,就很好写代码了。

代码如下:

class Solution(object):
    # 本题采用回溯法解决
    # 注意点:IP地址空缺位不补0
    def restoreIpAddresses(self, s):
        """
        :type s: str
        :rtype: List[str]
        """
        # 定义包含所有可能的IP地址的列表
        address_list = []
        if len(s) < 4 or len(s) > 12:
            return address_list

        # 核心的递归算法
        def back(address=[], s=s):
            if len(address) == 4 and len(s) == 0:
                address_str = ".".join(address)
                if address_str not in address_list:
                    address_list.append(address_str)
                return
            for index in range(3):
                if len(s) >= index+1:
                    one_str = s[:index+1]
                    # 若出现"010010"情况,对于0的取舍需要着重考虑
                    # 关键一条就是:切割完的IP地址长度与原地址长度相等
                    if int(one_str) in range(256) and str(int(one_str)) == one_str:
                        one_str = str(int(one_str))
                        back(address+[one_str], s[index+1:])

        back()
        return address_list


if __name__ == "__main__":
    s = "010010"
    address = Solution().restoreIpAddresses(s)
    print(address)

不过执行效率还是很低,有点郁闷!!!

猜你喜欢

转载自blog.csdn.net/c710473510/article/details/88760978
今日推荐