LeetCode-93. 复原 IP 地址

题目来源

93. 复原 IP 地址

题目详情

有效 IP 地址 正好由四个整数(每个整数位于 0255 之间组成,且不能含有前导 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"]

示例 5:

输入: s = "101023"
输出: ["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]

提示:

  • 0 <= s.length <= 20
  • s 仅由数字组成

题解分析

解法一:深度优先搜索 + 回溯

  1. 本题最容易想到的就是使用回溯的思想,依次递增位置变量来指示现在处理到的位置,直到遇到字符串结尾。
  2. 此外,需要设置一个cnt计数器来表示IP地址目前的第几个部分,只有当cnt == 4且遍历到原串结尾时才表示找到了符合条件的IP地址。
  3. 本题需要注意的是,合规的IP地址是不能包含前导0的,所以这里需要在代码中做一点额外的处理。
class Solution {
    List<String> res = new ArrayList<>();
    public List<String> restoreIpAddresses(String s) {
        dfs(s, 0, "", 0);
        return res;
    }
    private void dfs(String s, int pos, String ans, int cnt){
        if(cnt > 4){
            return;
        }
        if(pos == s.length()){
            if(cnt == 4){
                res.add(ans.substring(0, ans.length() - 1));
            }
            return;
        }
        int num = 0;
        for(int i=pos; i<s.length(); i++){
            char temp = s.charAt(i);
            if(i == pos && temp == '0'){
                dfs(s, i + 1, ans + "0.", cnt + 1);
                break;
            }
            num = num * 10 + temp - '0';
            ans = ans + temp;
            if(num >=0 && num <= 255){
                dfs(s, i + 1, ans + ".", cnt + 1);
            }else{
                break;
            }
        }
    }
}

结果展示

image

posted @ 2022-01-22 10:26  Garrett_Wale  阅读(37)  评论(0编辑  收藏  举报