leetcode 93. Restore IP Addresses

507 阅读2分钟

题目

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)

题目大意

就是给你一个字符串,返回能分割成的ip组合,返回为一个字符串数组,数组顺序无所谓。

解题思路

  • ip的特点
    • 除去点,最长12个字符。
    • 每一段最长三个字符
    • 每一段不能大于255,手字符不能为0
  • 特殊case "0000","10000100"

代码片段

    List<String> res = new ArrayList<>();

    public List<String> restoreIpAddresses(String s) {

        if (s.length() > 12 || s.length() < 4) {
            return res;

        }
        ipHelper(s, 0, new ArrayList<>());
        return res;
    }

    /**
     * @param s     街衢对应段之后段字符串
     * @param count 正在计算的段,0,1,2,3
     * @param list  中间结果
     */
    private void ipHelper(String s, int count, List<String> list) {
        /*不是最后一段的时候*/
        if (count != 3) {
            /*最小的是后面每段都是3,他这边最少得取的值,下限是1*/
            int low = s.length() - (3 - count) * 3 > 1 ? s.length() - (3 - count) * 3 : 1;
            /*最大的是后面每段都是1,他这边最多得取的值,上线是3*/
            int up = s.length() - (3 - count) < 3 ? s.length() - (3 - count) : 3;
            if (low > up) {
                return;
            }
            for (int i = low; i <= up; i++) {
                String s1 = s.substring(0, i);
                Integer value1 = Integer.parseInt(s1);
                /*抛弃连续0的情况*/
                if (i > 1 && s1.startsWith("0")) {
                    return;
                }
                /*兼容0.0.0.0的情况*/
                if (value1 < 0 || value1 > 255) {
                    /*不符合生成条件*/
                    return;
                }
                list.add(s1);
                ipHelper(s.substring(i), count + 1, list);
                list.remove(count);
            }
        } else {
            if (s.length() > 3) {
                /*不符合规则*/
                return;
            }
            Integer value1 = Integer.parseInt(s);
            if (s.length()>1 && s.startsWith("0")) {
                return;
            }
            /*兼容0.0.0.0的情况*/
            if (value1 < 0 || value1 > 255) {
                /*不符合生成条件*/
                return;
            }
            list.add(s);
            res.add(String.join(".", list));
            list.remove(count);
        }
    }

leetcode上耗时比较少的方案

class Solution {
    // 3 dots, 4 num; 0<=num<=255 with no leading zeros
    public List<String> restoreIpAddresses(String s) {
        List<String> validAddresses = new ArrayList<>();

        // use for to split string into 4 substring, check each one is valid or not, not start with 0 and < 255
        // if every substring is valid, record answer
        for (int i=1;i<s.length() && i<4;i++){ 
            if (isValid(s.substring(0,i))){
                for (int j=i+1;j<s.length() && j<i+4;j++){ 
                    if (isValid(s.substring(i,j))){
                        for (int k=j+1;k<s.length() && k<j+4;k++){ //bug
                            if (s.length()-k>3) continue; // bug 
                            if (isValid(s.substring(j,k)) && isValid(s.substring(k))){
                                StringBuilder sol=new StringBuilder();
                                sol.append(s.substring(0,i)).append(".").append(s.substring(i,j)).append(".")
                                .append(s.substring(j,k)).append(".").append(s.substring(k));
                                validAddresses.add(sol.toString());
                            }
                        }   
                    }
                }  
            }
        }
        return validAddresses;
    }
    
    private boolean isValid(String s){
        if (s.charAt(0)=='0' && s.length()>1) return false;
        if (Integer.parseInt(s) > 255) return false;
        return true;
    }
    
    
}