leetcodeday93 –复原 IP 地址

有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。

  • 例如:”0.1.2.201″ 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、”192.168.1.312″ 和 “192.168@1.1” 是 无效 IP 地址。

给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你不能重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。

示例 1:

输入:s = "25525511135"
输出:["255.255.11.135","255.255.111.35"]

示例 2:

输入:s = "0000"
输出:["0.0.0.0"]

示例 3:

输入:s = "1111"
输出:["1.1.1.1"]

示例 4:

输入:s = "010010"
输出:["0.10.0.10","0.100.1.0"]

思路回溯算法

# @lc app=leetcode.cn id=93 lang=python3
#
# [93] 复原 IP 地址
#
#回溯算法:
# void backtracking(参数) {
#     if (终止条件) {
#         存放结果;
#         return;
#     }

#     for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
#         处理节点;
#         backtracking(路径,选择列表); // 递归
#         回溯,撤销处理结果
#     }
# }

# @lc code=start
class Solution:
    def restoreIpAddresses(self, s: str) -> List[str]:
        def backtracking(n,now,k,rev):
            if  k==1:
                if n-now in range(1,4) and str(int(s[now:n]))==s[now:n] and int(s[now:n]) in range(0,256):
                    res.append(rev+s[now:n]) 
                return
            for i in range(1,4):
                if now+i<n and str(int(s[now:now+i]))==s[now:now+i] and int(s[now:now+i]) in range(0,256):
                    now=now+i
                    backtracking(n,now,k-1,rev+s[now-i:now]+".")
                    now=now-i
        # s = "25525511125"
        rev=str()
        res=list()
        backtracking(len(s),0,4,rev)
        return res
# @lc code=end

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注