码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode Restore IP Addresses

时间:2015-02-23 10:55:22      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:

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解决,但是实现的时候还是走了不少弯路。基本思路是不断的取子串,看是否合法,如果合法继续递归取子串组成IP地址。有几个要注意的地方:第一,判断IP地址是否合法的时候,要看是否在0-255之间,并且长度不超过3,并且长度大于2的子串首字符不能是0。第二,如果用裸DFS,这题是会超时的,根据这题的特点,一个明显的减枝策略是我们知道每个合法IP地址一定只有4个子串,因此,树的层次树不会超过4层,到第4层后就没有必要再递归下去。剩下的就是基本DFS问题的套路了,递归中套for循环,for循环中递归调用。第三,DFS递归调用时不要先修改item内容再传入,而是把item作为参数一部分直接传入,这样递归调用返回item和start才能仍然保持同步,自动恢复现场,start要始终指向item最后一个字符的相邻下一个字符。 DFS/BFS搜索这类题在面试中非常常见,几乎必考,有些题目实现还有tricky的地方,比如这题的减枝策略,要多加练习。因为是NP问题,时间复杂度指数级,但是树的层次树不会超过4.

AC Code

public class Solution {
   public List<String> restoreIpAddresses(String s) {
        List<String> res = new ArrayList<String>();
        if(s.length() == 0) return res;
        dfs(res, s, 0, "", 1);
        return res;
    }
    
    void dfs(List<String> res, String s, int start, String item, int segmentIndex){
        //use segmentIndex to memorize the number of segments
        //An IP address only have 4 segments, which could be used as pruning condition
        if(start >= s.length()) {
            return;
        }
        if(segmentIndex == 4){
            String substr = s.substring(start);
            if(isValidIPAddress(substr)){
                res.add(item + "." + substr);
            }
            return;
        }
        for(int i = 1; i < 4 && ((start + i) <= s.length()); i++){
            String substr = s.substring(start, start + i);
            if(isValidIPAddress(substr)){
                if(segmentIndex == 1){
                    dfs(res, s, start + i, substr, segmentIndex + 1);
                } else {
                	//Here we can‘t modify the content of item
                	//Since we want item always match start
                	//When segment == 4 and return, we hope the content of item
                	//and start to restore in the same time
                    dfs(res, s, start + i, item + "." + substr, segmentIndex + 1);
                }
            }
        }
    }
    
    boolean isValidIPAddress(String substr){
         if(substr.length() >=4 || substr.isEmpty()) return false;
         if(substr.charAt(0) == ‘0‘ && substr.length() > 1) return false;
         int temp = Integer.parseInt(substr);
         if(temp >= 0 && temp <= 255){
            return true;
         }
         return false;
    }
}


LeetCode Restore IP Addresses

标签:

原文地址:http://blog.csdn.net/yangliuy/article/details/43915517

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!