LeetCode--复原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 中的任何数字。你可以按 任何 顺序返回答案。
思路:将字符串装入StringBuilder中,对sb进行分割,如果满足合法的ip地址则加上'.' ,进行递归。
题解:

csharp 复制代码
private List<String> res = new ArrayList<>();
private StringBuilder path;
private int count = 0;
public List<String> restoreIpAddresses(String s) {
    path = new StringBuilder(s);
    backtracking(0);
    return res;
}
private void backtracking(int i) {
    // 终止条件,逗号的个数等于3
    if (count == 3) {
        // 判断第四段字符串是否是合法的IP地址
        if (isValid(path, i, path.length()-1)) {
            res.add(path.toString());
        }
        return;
    }
    for (int j = i; j < path.length(); j++) {
        // 判断是否是合法的IP地址
        if (isValid(path, i, j)) {
            // 插入逗号
            path.insert(j+1, '.');
            // 逗号计数器加一
            count++;
            // 递归+2 是因为插入了逗号,所以要跳过
            backtracking(j+2);
            // 回溯
            path.deleteCharAt(j+1);
            // 逗号计数器减一
            count--;
        }
    }
}
// 判断是否是合法的IP地址
private boolean isValid(StringBuilder s,int left ,int right) {
    // 判断长度
    if (left > right) {
        return false;
    }
    // 判断是否以0开头
    if (s.charAt(left) == '0' && left != right) {
        return false;
    }
    // 判断是否在0-255之间
    int num = 0;
    for (int i = left; i <= right; i++) {
        if (sb.charAt(i) >= '0' && sb.charAt(i) <= '9') {
            int temp = sb.charAt(i)-'0';
            num = num*10 + temp;
        } else {
            return false;
        }
    }
    return res >= 0 && res <= 255;
}
相关推荐
mmmmath_38 小时前
LeetCode.199.二叉树的右视图
数据结构·leetcode
专注仿真8 小时前
引擎扩展性与集成设计深度剖析:从 14 个扩展点到 DIS→HLA 演进之路
开发语言·算法·仿真引擎·推演引擎
码爸8 小时前
支持向量机介绍与示例
算法·机器学习·支持向量机
怕浪猫8 小时前
2028编程圈很火的10个Skills
算法·面试·github
北京盛世宏博10 小时前
通信异常深度排查:以太网温湿度设备 TCP 粘包、UDP 丢包根治方案
单片机·网络协议·tcp/ip·udp·以太网·传感器·温湿度
Nil20813 小时前
leetcode 198打家劫舍
算法·leetcode·职场和发展
Shaoshing13 小时前
前缀和与差分
java·数据结构·算法·前缀和·差分
mmmmath_313 小时前
LeetCode.429.N叉树的层序遍历
数据结构·leetcode
false_or_true13 小时前
一次由 tcp_tw_recycle 引发的“灵异”故障排查:基于双网闸架构的踩坑记
网络·tcp/ip·架构
loulanyue_14 小时前
构建房产认知决策智能:Harness底座与AI自进化的技术实践——读贝壳首席算法科学家尹俊希2026云栖专场演讲
人工智能·算法