zoukankan      html  css  js  c++  java
  • leetcode -- Restore IP Addresses

    Given a string containing only digits, restore it by returning all possible valid IP address combinations.

    For example:
    Given "25525511135",

    return ["255.255.11.135", "255.255.111.35"]. (Order does not matter)

    [解题思路]

    DFS + Backtracking

    给定的字符串分成4段,每段都0<= m <= 255

    DFS 终止条件:

    1. 剩余位数 > 剩余段数*3

    2. 剩余位数 < 剩余段数

    3. depth == 4

    给定的字符串每一位都必须出现在最后生成的ip中,一开始没有注意

    当输入为:“010010”

    未加line38-40 输出:[0.1.0.10, 0.1.1.0, 0.10.0.10, 0.10.1.0, 0.100.1.0, 1.0.0.10, 1.0.1.0, 10.0.1.0]

    系统期望输出为:[0.10.0.10, 0.100.1.0]

    故当某一位出现在为0时,则break,停止继续计算num,该位就为0

     1 public static ArrayList<String> restoreIpAddresses(String s) {
     2         // Start typing your Java solution below
     3         // DO NOT write main() function
     4         ArrayList<String> result = new ArrayList<String>();
     5         if (s == null || s.length() == 0) {
     6             return result;
     7         }
     8         int depth = 0, start = 0;
     9         String ip = "";
    10         generate(s, start, depth, result, ip);
    11 
    12         return result;
    13     }
    14 
    15     private static void generate(String s, int start, int depth,
    16             ArrayList<String> result, String ip) {
    17         // max = 3 check it
    18         if ((s.length() - start) > (4 - depth) * 3) {
    19             return;
    20         }
    21         // min = 1 check it
    22         if (s.length() - start < 4 - depth) {
    23             return;
    24         }
    25         if (depth == 4) {
    26             ip = ip.substring(0, ip.length() - 1);
    27             if(!result.contains(ip))
    28                 result.add(ip);
    29             return;
    30         }
    31 
    32         int num = 0;
    33         for (int i = start; i < Math.min(start + 3, s.length()); i++) {
    34             num = num * 10 + (s.charAt(i) - '0');
    35             if (num <= 255) {
    36                 generate(s, i + 1, depth + 1, result, ip + num + ".");
    37             }
    38             if(num == 0){
    39                 break;
    40             }
    41         }
    42     }
  • 相关阅读:
    C++对象模型与内存位对齐的简单分析(GNU GCC&VS2015编译器)
    [GeekBand] C++学习笔记(2)——BigThree、OOP
    [GeekBand] C++ 高级编程技术 (1)
    [GeekBand]C++高级编程技术(2)
    C++中引用的本质分析
    函数的重载(1)
    C++的特点
    布尔类型和三目运算符
    Linux客户端下的latex相关操作
    无光驱上网本上安装win7
  • 原文地址:https://www.cnblogs.com/feiling/p/3301869.html
Copyright © 2011-2022 走看看