Restore IP Address

这道题和Palindrome Partitioning很像,都是怎么切数组的问题,唯一需要注意的是ip的规定

1)不能出现0和其他数字组合, 类似0.00.01.1。0只能单独出现或者在一个片段中不为开头的数字。

2)每一个片段数字最大为255

3)只能有四个片段

4)这里需要注意一个细节: 在这里加入sub.length()>3就无需继续的原因也是避免sub过大,超过integer,从而使Integer.parseInt(s) threw exception

public class Solution {
    /**
     * @param s the IP string
     * @return All possible valid IP addresses
     */
    public ArrayList<String> restoreIpAddresses(String s) {
        // Write your code here
        ArrayList<String> result = new ArrayList<String>();
        if("".equals(s)){
            return result;
        }
        List<String> ips = new ArrayList<String>();
        helper(result, ips, s, 0);
        return result;
    }
    
    private void helper(ArrayList<String> result, List<String> ips,
                        String s, int start){
        if(start == s.length() && ips.size() == 4){
            StringBuilder ip = new StringBuilder();
            for(String ipPart : ips){
                ip.append(ipPart);
                ip.append('.');
            }
            result.add(ip.deleteCharAt(ip.length()-1).toString());
            return;
        }
        
        for (int i = start; i < s.length(); i++){
            String sub = s.substring(start, i+1);
            if(sub.length()>3 || ips.size()>4 || 
               isZeroStart(sub) || Integer.parseInt(sub)>255){
                continue;
            }
            ips.add(sub);
            helper(result, ips, s, i+1);
            ips.remove(ips.size()-1);
        }
    }
    
    private boolean isZeroStart(String s){
        if('0' == s.charAt(0) && s.length() > 1){
            return true;
        }
        return false;
    }
}

 

posted on 2016-08-20 04:51  codingEskimo  阅读(262)  评论(0编辑  收藏  举报

导航