Restore IP Addresses @Leetcode

https://oj.leetcode.com/problems/restore-ip-addresses/

这道题的解法非常接近于NP问题,也是采用递归的解法。基本思路就是取出一个合法的数字,作为IP地址的一项,然后递归处理剩下的项。可以想象出一颗树,每个结点有三个可能的分支(因为范围是0-255,所以可以由一位两位或者三位组成)。并且这里树的层数不会超过四层,因为IP地址由四段组成,到了之后我们就没必要再递归下去,可以结束了。这里除了上述的结束条件外,另一个就是字符串读完了。可以看出这棵树的规模是固定的,不会像平常的NP问题那样,时间复杂度取决于输入的规模,是指数量级的,所以这道题并不是NP问题,因为他的分支是四段,有限制。

ref: http://blog.csdn.net/linhuanmars/article/details/24683699

这是九章算法的官方解答:

http://answer.ninechapter.com/solutions/restore-ip-addresses/

这是我自己写了一次:

public class Solution {
    public List
   
   
    
     restoreIpAddresses(String s) {
        ArrayList
    
    
     
      rst = new ArrayList
     
     
      
      ();
        
        help(s, 0, rst, new ArrayList
      
      
       
       (), 0);
        
        return rst;
    }
    
    // level: indicate how many levels we come to.
    public void help(String s, int level, ArrayList
       
       
         result, ArrayList 
        
          list, int index) { if (level == 4) { if (index != s.length()) { // if level = 4 and the string is not end, don't need to iterate again. return; } StringBuilder sb = new StringBuilder(); for (int i = 0; i < 4; i++) { sb.append(list.get(i)); if (i != 3) { sb.append('.'); } } result.add(sb.toString()); } for (int i = index; i < s.length() && i < index + 3; i++) { String tmp = s.substring(index, i + 1); list.add(tmp); if (isValid(tmp)) { help(s, level + 1, result, list, i + 1); } list.remove(list.size() - 1); } } public boolean isValid(String s) { if (s.charAt(0) == '0') { return s.equals("0"); // 00, 010 is invalid; } int n = Integer.valueOf(s); if (n <= 255 && n >= 0) { return true; } return false; } } 
         
       
      
      
     
     
    
    
   
   

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值