当前位置: 首页 > article >正文

LeetCode_回溯_中等_93.复原 IP 地址

目录

  • 1.题目
  • 2.思路
  • 3.代码实现(Java)

1.题目

有效 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 = “101023”
输出:[“1.0.10.23”,“1.0.102.3”,“10.1.0.23”,“10.10.2.3”,“101.0.2.3”]

提示:
1 <= s.length <= 20
s 仅由数字组成

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/restore-ip-addresses

2.思路

(1)回溯
思路参考本题官方题解。

3.代码实现(Java)

//思路1————回溯
class Solution {

    static final int SEG_COUNT = 4;
    List<String> res = new ArrayList<>();
    int[] segments = new int[SEG_COUNT];

    public List<String> restoreIpAddresses(String s) {
        backtrack(s, 0, 0);
        return res;
    }

    public void backtrack(String s, int segId, int segStart) {
        //如果找到了 4 段 IP 地址并且遍历完了字符串,那么就是一种答案
        if (segId == SEG_COUNT) {
            if (segStart == s.length()) {
                StringBuilder builder = new StringBuilder();
                for (int i = 0;i < SEG_COUNT; i++) {
                    builder.append(segments[i]);
                    if (i != SEG_COUNT - 1) {
                        builder.append('.');
                    }
                }
                res.add(builder.toString());
            }
            return;
        }
        //如果还没有找到 4 段 IP 地址就已经遍历完了字符串,那么提前回溯
        if (segStart == s.length()) {
            return;
        }
        //由于不能有前导零,如果当前数字为 0,那么这一段 IP 地址只能为 0
        if (s.charAt(segStart) == '0') {
            segments[segId] = 0;
            backtrack(s, segId + 1, segStart + 1);
        }
        //一般情况,枚举每一种可能性并递归
        int addr = 0;
        for (int segEnd = segStart; segEnd < s.length(); segEnd++) {
            addr = addr * 10 + (s.charAt(segEnd) - '0');
            if (addr > 0 && addr <= 255) {
                segments[segId] = addr;
                backtrack(s, segId + 1, segEnd + 1);
            } else {
                break;
            }
        }
    }
}

http://www.kler.cn/a/15856.html

相关文章:

  • 数仓建设之Oracle常见语法学习
  • hive表名重命名、rename重命名
  • 速盾:cdn 支持 php 吗?
  • 基于Spring Boot的电子商务系统设计
  • K8S containerd拉取harbor镜像
  • C语言之MakeFile
  • 使用 ESP32 设计智能手表第 3 部分 - 磁力计和陀螺仪
  • mysql中int、bigint、smallint 和 tinyint的区别详细介绍
  • 【网络编程】网络基础
  • 人工智能之配置环境教程二:在Anaconda中创建虚拟环境安装GPU版本的Pytorch及torchvision并在VsCode中使用虚拟环境
  • leetcode 45. 跳跃游戏 II
  • KALI入门到高级【第三章】
  • iOS autorelease 示例研究
  • 读SQL进阶教程笔记14_SQL编程要点
  • 倾斜摄影超大场景的三维模型的顶层合并的轻量化处理技术
  • 信息系统项目管理师 第9章 项目范围管理
  • 如何理解自动化测试数据驱动与关键字驱动的区别?
  • 【C生万物】 指针篇 (初级)
  • 程序员都有哪些就业方向?不是所有人都能去互联网公司的!
  • Git HEAD及detached head
  • Android JetPack组件之Lifecycle
  • Linux中的阻塞机制
  • NetMQ | 发布订阅时使用含通配符的Topic
  • 第十一章 Transform组件(上)
  • 04_Uboot操作命令与其他命令
  • Shell(五)Bash行操作目录堆栈