zoukankan      html  css  js  c++  java
  • 【1】【leetcode-93】复原IP地址

    (不会,典型)

    给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。

    示例:

    输入: "25525511135"
    输出: ["255.255.11.135", "255.255.111.35"]


    1.回溯法+剪枝:

    public class Solution {
        public List<String> restoreIpAddresses(String s) {
            List<String> res = new ArrayList<String>();
            helper(s, 0, "", res);
            return res;
        }
    //res结果,s余下的输入字符串,out当前已经拼凑出来的字符串,n未处理的字段数(一个ip四个字段)
        public void helper(String s, int n, String out, List<String> res) {
            if (n == 4) {
                if (s.isEmpty()) res.add(out);
                return;
            }
            // 取k=1-3个数作为下一段
            for (int k = 1; k < 4; ++k) {
                if (s.length() < k) break;
                int val = Integer.parseInt(s.substring(0, k));
                if (val > 255 || k != String.valueOf(val).length()) continue;
                helper(s.substring(k), n + 1, out + s.substring(0, k) + (n == 3 ? "" : "."), res);
            }
        }
    }

    自己写的时候

    if (val > 255 || k != String.valueOf(val).length()) continue;
    中缺少了k != String.valueOf(val).length()判断,
    答案错误:您提交的程序没有通过所有的测试用例
    case通过率为1.37%
    
    用例:
    "010010"
    
    对应输出应该为:
    
    ["0.10.0.10","0.100.1.0"]
    
    你的输出为:
    
    ["0.1.0.010","0.1.00.10","0.1.001.0","0.10.0.10","0.10.01.0","0.100.1.0","01.0.0.10","01.0.01.0","01.00.1.0","010.0.1.0"]

    這一句避免了010这样的数,Integer.parseInt(“010”) = 10

    2.暴力求解法:

    由于每段数字最多只能有三位,而且只能分为四段,所以情况并不是很多,我们可以使用暴力搜索的方法,每一段都循环1到3,然后当4段位数之和等于原字符串长度时,我们进一步判断每段数字是否不大于255,然后滤去不合要求的数字,加入结果中即可,参见代码如下;

    public class Solution {
        public List<String> restoreIpAddresses(String s) {
            List<String> res = new ArrayList<String>();
            for (int a = 1; a < 4; ++a) 
            for (int b = 1; b < 4; ++b) 
            for (int c = 1; c < 4; ++c)
            for (int d = 1; d < 4; ++d) 
                if (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) {
                        String t = String.valueOf(A) + "." + String.valueOf(B) + "." + String.valueOf(C) + "." + String.valueOf(D);
                        if (t.length() == s.length() + 3) res.add(t);
                    }
                }
            return res;
        }
    }
  • 相关阅读:
    javascript:history.go()和History.back()的区别
    Web 开发] 定制IE下载对话框的按钮(打开/保存)(转)
    JavaScript 浮动定位提示效果(转)
    关于网页*静态化*及SEO问题的一些补充(转)
    httpanalyzer 结合 HttpWebRequest Post的运用
    SEO工具大全(转)
    导出excel
    Asp.NET导出Excel文件乱码解决若干方法 (转)
    关于DataBinder.Eval Eval Bind
    电脑疑似中毒
  • 原文地址:https://www.cnblogs.com/twoheads/p/10600741.html
Copyright © 2011-2022 走看看