zoukankan      html  css  js  c++  java
  • LeetCode: Restore IP Addresses 解题报告

    Restore IP Addresses

    My Submissions

    Question

     Solution 

    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)

    SOLUTION 1:

    如果有跟过主页君的讲解,就会知道,这又是一道相当经典的DFS模板题目。 我们照样套用http://www.ninechapter.com/的递归

    模板,退出条件是:path.size == 4.

    在模板中,我们加入一些判断条件来中断循环:例如说判断pre的字符串转化后的数字是不是在255以内。

    另外,我们要排除055这种数字,所以加入这一行判断:

    if (s.charAt(index) == '0' && i > index) {
      break;
    }

    虽然是很简单的递归题,但主页君是真心用心写了的。而且这是相当经典的递归模板。同学们一定要记住这种模板解法哦!

     1 public List<String> restoreIpAddresses(String s) {
     2         if (s == null) {
     3             return null;
     4         }
     5         
     6         ArrayList<String> ret = new ArrayList<String>();
     7         ArrayList<String> path = new ArrayList<String>();
     8         
     9         dfs(s, 0, path, ret);
    10         
    11         return ret;
    12     }
    13     
    14     public void dfs(String s, int index, ArrayList<String> path, ArrayList<String> ret) {
    15         if (path.size() == 4) {
    16             if (index == s.length()) {
    17                 StringBuilder sb = new StringBuilder();
    18                 for (String str: path) {
    19                     sb.append(str);
    20                     sb.append('.');
    21                 }
    22                 
    23                 sb.deleteCharAt(sb.length() - 1);
    24                 ret.add(sb.toString());
    25             }
    26             
    27             return;
    28         }
    29         
    30         int len = s.length();
    31         for (int i = index; i < index + 3 && i < len; i++) {
    32             if (s.charAt(index) == '0' && i > index) {
    33                 break;
    34             }
    35             
    36             String pre = s.substring(index, i + 1);
    37             int num = Integer.parseInt(pre);
    38             if (num > 255) {
    39                 continue;
    40             }
    41             
    42             path.add(pre);
    43             dfs(s, i + 1, path, ret);
    44             path.remove(path.size() - 1);
    45         }
    46     }
    View Code

    2015.1.1 redo:

    容易出错的点:1. i的索引,注意不要越界。2. 记得把sb添加到ret中。

     1 public class Solution {
     2     public List<String> restoreIpAddresses(String s) {
     3         List<String> ret = new ArrayList<String>();
     4         // Bug 1: not length, but length().
     5         if (s == null || s.length() < 4 || s.length() > 12) {
     6             return ret;
     7         }
     8         
     9         dfs(s, new ArrayList<String>(), ret, 0);
    10         return ret;
    11     }
    12     
    13     public void dfs(String s, List<String> path, List<String> ret, int index) {
    14         // THE BASE CASE:
    15         int len = s.length();
    16         if (path.size() == 4) {
    17             // Create a solution.
    18             if (index == len) {
    19                 StringBuilder sb = new StringBuilder();
    20                 for (String str: path) {
    21                     sb.append(str);
    22                     sb.append(".");
    23                 }
    24                 sb.deleteCharAt(sb.length() - 1);
    25                 
    26                 // bug 3: forget this statement.
    27                 ret.add(sb.toString());
    28             }
    29             
    30             return;
    31         }
    32         
    33         // 2/ 25 / 255
    34         // bug 2: i should < len.
    35         for (int i = index; i < index + 3 && i < len; i++) {
    36             String sub = s.substring(index, i + 1);
    37             if (s.charAt(index) == '0' && i != index) {
    38                 // only allow 0, not 02, 022
    39                 break;
    40             }
    41             
    42             if (!isValid(sub)) {
    43                 continue;
    44             }
    45             
    46             path.add(sub);
    47             dfs(s, path, ret, i + 1);
    48             path.remove(path.size() - 1);
    49         }
    50     }
    51     
    52     public boolean isValid(String s) {
    53         int num = Integer.parseInt(s);
    54         return num >= 0 && num <= 255;
    55     }
    56 }
    View Code

    GITHUB:

    https://github.com/yuzhangcmu/LeetCode_algorithm/blob/master/string/RestoreIpAddresses.java

  • 相关阅读:
    discuz Ucenter第三方双向同步登录
    python: 输出 1~100 之间不能被 7 整除的数,每行输出 10 个数字,要求应用字符串格式化方法美化输出格式。
    用python语言来判断一个数是否是水仙花数?
    java如何调用webservice接口
    ASP.NET 全局变量和页面间传值方法
    从客户端中检测到有潜在危险的 Request.Form 值] 处理办法
    第一次作业要点及重要属性
    Servlet生命周期
    cookie与session的比较
    零基础学习HTML5
  • 原文地址:https://www.cnblogs.com/yuzhangcmu/p/4106686.html
Copyright © 2011-2022 走看看