LeetCode 93. Restore IP Addresses

简介: 给定一个用数字表示的字符串,把它们恢复成可能的IP地址.

v2-5515f4dda559edaf85f0b3f32172cf53_1440w.jpg

Description



Given a string containing only digits, restore it by returning all possible valid IP address combinations.


Example:


Input: "25525511135"
Output: ["255.255.11.135", "255.255.111.35"]


描述



  • 给定一个用数字表示的字符串,把它们恢复成可能的IP地址.
  • 有效的IP地址格式为:

1.一共有4段,每一段之间用点号'.'隔开.

2.每一段的值小于等于255.

3.每一段不能以0开头(除了只有0本身的情况).


思路



  • 此题目使用递归的方法.
  • 我们每次尝试从给定的字符串s种拿出一个字符,或者两个字符,或者三个字符作为一段,然后从剩下的字符种拿出一个,或两个,或三个作为一段
  • 我们用depth表示已经去到了的段数,index表示剩下的字符的开始索引,length表示剩下的字符个数.
  • 递归结束条件

1.当depth == 4 and length == 0,说明我们已经取到了三段,并且s中没有剩下的字符,说明当前的解有效,我们添加到最终结果之中.

2.当depth == 4 and lenght > 0,说明我们已经去到了三段,但是s中还有剩下的字符,说明当前的解无效,函数返回.

  • 在循环的过程中,如果s中已经没有剩下的字符,跳出循环.
  • 如果当前段取了不止一个字符且第一个字符是'0',说明当前段不合法,跳出循环.
  • 如果当前段取了三个字符且这三个字符构成的数字大于255,说明当前段不合法,跳出循环.


# -*- coding: utf-8 -*-
# @Author:             何睿
# @Create Date:        2018-12-26 14:00:33
# @Last Modified by:   何睿
# @Last Modified time: 2018-12-26 14:00:33
class Solution:
    def restoreIpAddresses(self, s):
        """
        :type s: str
        :rtype: List[str]
        """
        length, res = len(s), []
        self.recur(s, res, '', 0, 0, length)
        return res
    def recur(self, s, res, path, index, depth, length):
        # 如果已经取了三段,还有s字符串还有剩余,直接返回
        if depth == 4 and length > 0:
            return
        # 如果已经取了三段,并且s字符串没有剩余,说明当前结果有效,把当前结果添加到最终结果之中
        # 注意要去掉最后一个点号
        if depth == 4 and length == 0:
            res.append(path[:-1])
        # 每次都可以取1个,或者2个,或者3个字符.
        for i in range(1, 4):
            # 如果当前已经没有字符剩余,跳出循环
            if length <= 0:
                break
            # IP地址的每一段不能以0开头
            if s[index] == '0'and i != 1:
                break
            # IP地址的每一段只能小于等于255
            if i == 3 and int(s[index:index+i]) > 255:
                break
            # 选择IP地址的下一段
            self.recur(s, res, path+s[index:index+i] +
                       ".", index+i, depth+1, length-i)
if __name__ == "__main__":
    so = Solution()
    res = so.restoreIpAddresses("111111111111111111111")
    print(res)


源代码文件在这里.

目录
相关文章
|
5月前
|
算法
代码随想录算法训练营第二十七天 | LeetCode 93. 复原 IP 地址、78. 子集、90. 子集 II
代码随想录算法训练营第二十七天 | LeetCode 93. 复原 IP 地址、78. 子集、90. 子集 II
34 0
|
6月前
|
算法
代码随想录Day23 回溯算法 LeetCode T93 复原ip地址 LeetCode T78子集 LeetCode T90 子集II
代码随想录Day23 回溯算法 LeetCode T93 复原ip地址 LeetCode T78子集 LeetCode T90 子集II
22 0
|
C++ Python
LeetCode 929. Unique Email Addresses
LeetCode 929. Unique Email Addresses
68 0
LeetCode | 93. 复原 IP 地址
LeetCode | 93. 复原 IP 地址
70 0
代码随想录刷题|LeetCode 93.复原IP地址 78.子集 90.子集II
代码随想录刷题|LeetCode 93.复原IP地址 78.子集 90.子集II
|
存储 算法
LeetCode 92反转链表Ⅱ&93复制ip地址&94二叉树的中序遍历
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
68 0
LeetCode 92反转链表Ⅱ&93复制ip地址&94二叉树的中序遍历
|
存储 算法
☆打卡算法☆LeetCode 93、复原 IP 地址 算法解析
“给定一个只包含整数的字符串,表示一个IP地址,返回所有可能有效的IP地址,在这些地址中插入点来形成。”
|
1月前
|
机器学习/深度学习 算法
力扣刷题日常(一)
力扣刷题日常(一)
20 2
|
1月前
|
存储 索引
《LeetCode》—— LeetCode刷题日记
《LeetCode》—— LeetCode刷题日记