• 93. Restore IP Addresses


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

    Example:

    Input: "25525511135"
    Output: ["255.255.11.135", "255.255.111.35"]
    class Solution {
    public List<String> restoreIpAddresses(String s) {
            List<String> res = new ArrayList<String>();
            int len = s.length();
            StringBuffer ip = new StringBuffer();
             for (int a=1; a<=3; a++){
                 for (int b=1; b<=3; b++){
                     for (int c=1; c<=3; c++){
                         int d = len - a - b - c;
                         if ( d > 0 && d <= 3 && a+b+c+d == s.length()) {
                             int A = Integer.parseInt(s.substring(0, a));
                             int B = Integer.parseInt(s.substring(a, a+b));
                             int C = Integer.parseInt(s.substring(a+b, a+b+c));
                             int D = Integer.parseInt(s.substring(a+b+c));
                             if (A<=255 && B<=255 && C<=255 && D<=255){
                                 ip.append(A).append(".").append(B).append(".").append(C).append(".").append(D);
                                 if( ip.length() == len + 3){
                                     res.add(ip.toString());
                                 }
                                 ip = new StringBuffer();
                             }
                         }   
                     }
                 }
             }
            return res;
        }
    }

    疯狗式解法。

    class Solution {
       public List<String> restoreIpAddresses(String s) {
            List<String> result = new ArrayList<>();
            doRestore(result, "", s, 0);
            return result;
        }
        
        private void doRestore(List<String> result, String path, String s, int k) {
            if (s.isEmpty() || k == 4) {
                if (s.isEmpty() && k == 4)
                    result.add(path.substring(1));
                return;
            }
            for (int i = 1; i <= (s.charAt(0) == '0' ? 1 : 3) && i <= s.length(); i++) { // Avoid leading 0
                String part = s.substring(0, i);
                if (Integer.valueOf(part) <= 255)
                    doRestore(result, path + "." + part, s.substring(i), k + 1);
            }
        }
    }

    注意ip地址并不能以0开头比如01.01.01.01,只能由1个0开头

    public List<String> restoreIpAddresses(String s) {
        List<String> ans = new ArrayList<>(); //保存最终的所有结果
        getAns(s, 0, new StringBuilder(), ans, 0);
        return ans;
    }
    
    /**
    * @param:  start 字符串开始部分
    * @param:  temp 已经划分的部分
    * @param:  ans 保存所有的解
    * @param:  count 当前已经加入了几部分
    */
    private void getAns(String s, int start, StringBuilder temp, List<String> ans, int count) {
        //如果剩余的长度大于剩下的部分都取 3 位数的长度,那么直接结束
        //例如 s = 121231312312, length = 12
        //当前 start = 1,count 等于 1
        //剩余字符串长度 11,剩余部分 4 - count = 3 部分,最多 3 * 3 是 9
        //所以一定是非法的,直接结束
        if (s.length() - start > 3 * (4 - count)) {
            return;
        }
        //当前刚好到达了末尾
        if (start == s.length()) {
            //当前刚好是 4 部分,将结果加入
            if (count == 4) {
                ans.add(new String(temp.substring(0, temp.length() - 1)));
            }
            return;
        }
        //当前超过末位,或者已经到达了 4 部分结束掉
        if (start > s.length() || count == 4) {
            return;
        }
        //保存的当前的解
        StringBuilder before = new StringBuilder(temp);
    
        //加入 1 位数
        temp.append(s.charAt(start) + "" + '.');
        getAns(s, start + 1, temp, ans, count + 1);
    
        //如果开头是 0,直接结束
        if (s.charAt(start) == '0')
            return;
    
        //加入 2 位数
        if (start + 1 < s.length()) {
            temp = new StringBuilder(before);//恢复为之前的解
            temp.append(s.substring(start, start + 2) + "" + '.');
            getAns(s, start + 2, temp, ans, count + 1);
        }
    
        //加入 3 位数
        if (start + 2 < s.length()) {
            temp = new StringBuilder(before);
            int num = Integer.parseInt(s.substring(start, start + 3));
            if (num >= 0 && num <= 255) {
                temp.append(s.substring(start, start + 3) + "" + '.');
                getAns(s, start + 3, temp, ans, count + 1);
            }
        }
    
    }
  • 相关阅读:
    五步轻松实现对现代浏览器的兼容
    本地存储—localStorage(HTML5)
    浏览器本地存储(browser-storage)
    behavior
    CodeForces
    Codeforces 982C(dfs+思维)
    Codeforces 982C(dfs+思维)
    P3370 【模板】字符串哈希
    codeforces 985E Pencils and Boxes(dp+思维)
    codeforces 985E Pencils and Boxes(dp+思维)
  • 原文地址:https://www.cnblogs.com/wentiliangkaihua/p/11560427.html
Copyright © 2020-2023  润新知