leetcode93复原IP地址-回溯-Java题解

48 篇文章 0 订阅
9 篇文章 0 订阅

/**

  • @author xin麒

  • @date 2022/12/14

  • 有效 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 仅由数字组成
    */
    class Solution {
    List res = new ArrayList<>();
    StringBuilder builder = new StringBuilder();
    char flag = ‘.’;
    String s;
    public List restoreIpAddresses(String s) {
    if (s.length() > 12) return res;
    this.s = s;
    backTracking(0,0);
    return res;
    }

    private void backTracking(int startIndex, int count) {
    if (count == 4) {

         builder.deleteCharAt(builder.length() - 1);//剔除第四个"."
    
         if (startIndex != s.length()) return;
    
         res.add(builder.toString());
         return;
     }
     for (int i = startIndex; i < s.length() && i < startIndex + 3; i++) {
         if (3*(4 - count) < s.length() - i) continue;
    
         String str = getStringByI(i,startIndex);
         if (str == null) return;
         builder.append(str);
         builder.append(flag);
    
         backTracking(i + 1,count + 1);
         if (builder.charAt(builder.length() - 1)== flag) builder.deleteCharAt(builder.length() - 1);
    
         builder.delete(builder.length() - str.length(),builder.length());//剔除str
     }
    

    }

    char zero = ‘0’;
    private String getStringByI(int i, int startIndex) {
    if (i > startIndex && s.charAt(startIndex) == zero) return null;

     String substring = s.substring(startIndex, i + 1);
     int num = Integer.parseInt(substring);
     if (num > 255) return null;
    
     return substring;
    

    }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值