leetcode-93:复原 IP 地址

简介: leetcode-93:复原 IP 地址

题目

题目链接

给定一个只包含数字的字符串,用以表示一个 IP 地址,返回所有可能从 s 获得的 有效 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 地址。

示例 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"]

解答

方法一:回溯

class Solution {
public:
    vector<string> res;
    void backtracing(string& s,int startIndex,int pointNum){
        if(pointNum==3){
            if(isValid(s,startIndex,s.size()-1)){
                res.push_back(s);
            }
            return;
        }
        for(int i=startIndex;i<s.size();i++){
            if(isValid(s,startIndex,i)){     //判断 [startIndex,i] 这个区间的子串是否合法
                s.insert(s.begin()+i+1,'.'); // 在i的后面插入一个逗点
                pointNum++;
                backtracing(s,i+2,pointNum); // 插入逗点之后下一个子串的起始位置为i+2
                pointNum--;                  // 回溯
                s.erase(s.begin()+i+1);      // 回溯删掉逗点
            }
            else break;
        }
    }
    bool isValid(string& s,int start,int end){
        if(start>end) return false;
        if(s[start]=='0'&&start!=end) return false; // 0开头的数字不合法
        int num=0;
        for(int i=start;i<=end;i++){
            if(s[i]<'0'||s[i]>'9') return false; // 遇到非数字字符不合法
            num=num*10+s[i]-'0';
            if(num>255) return false; // 如果大于255了不合法
        }
        return true;
    }
    vector<string> restoreIpAddresses(string s) {
        backtracing(s,0,0);
        return res;
    }
};

java

class Solution {
    List<String> res=new LinkedList<>();
    void dfs(StringBuilder sb,int startIndex,int pointNum){
        if(pointNum==3){
            if(isValid(sb,startIndex,sb.length()-1)){
                res.add(sb.toString());
            }
            return;
        }
        for(int i=startIndex;i<sb.length();i++){
            if(isValid(sb,startIndex,i)){
                sb.insert(i+1,'.');
                dfs(sb,i+2,pointNum+1);
                sb.deleteCharAt(i+1);
            }
        }
    }
    boolean isValid(StringBuilder sb,int l,int r){
        if(l>r||r-l+1>3) return false;
        if(sb.charAt(l)=='0'&&l!=r) return false;
        Integer num=Integer.valueOf(sb.substring(l,r+1));
        if(num<0||num>255) return false;
        return true;
    }
    public List<String> restoreIpAddresses(String s) {
        StringBuilder sb=new StringBuilder(s);
        dfs(sb,0,0);
        return res;
    }
}


相关文章
|
7月前
|
算法
leetcode93复原 IP 地址刷题打卡
leetcode93复原 IP 地址刷题打卡
48 0
|
4月前
|
算法
LeetCode第93题复原 IP 地址
文章介绍了LeetCode第93题"复原 IP 地址"的解法,利用回溯算法和剪枝技术,通过树形图分析求解过程,实现了将字符串分割成满足IP地址段要求的子段,并验证每个子段是否有效。
LeetCode第93题复原 IP 地址
|
7月前
leetcode:1108. IP 地址无效化
leetcode:1108. IP 地址无效化
38 0
|
算法
代码随想录算法训练营第二十七天 | LeetCode 93. 复原 IP 地址、78. 子集、90. 子集 II
代码随想录算法训练营第二十七天 | LeetCode 93. 复原 IP 地址、78. 子集、90. 子集 II
63 0
|
算法
代码随想录Day23 回溯算法 LeetCode T93 复原ip地址 LeetCode T78子集 LeetCode T90 子集II
代码随想录Day23 回溯算法 LeetCode T93 复原ip地址 LeetCode T78子集 LeetCode T90 子集II
40 0
LeetCode | 93. 复原 IP 地址
LeetCode | 93. 复原 IP 地址
110 0
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
62 6
|
4月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
124 2