93. Restore IP Addresses

这道题不难哈,DFS做就好了。
这里分享一个楼主三次写这道题不同的代码。
先贴最近写的, 是不是很短很漂亮。
if (s.charAt(index) == '0' && i > index) break; 这一句是我最近学到的用来去除首位为零的多位数的trick。 还有学到的是尽量让base case帮你处理各种corner case, 这样主逻辑就不需要写那么多if else。
StringBuilder这个东西,用了确实可以提高效率,不过在这里就算了吧。数据那么小,还是以提高代码可读性为主。

    public List restoreIpAddresses(String s) {
        List ans = new ArrayList<>();
        dfsHelper(s, 0, 0, ans, "");
        return ans;
    }
    private void dfsHelper(String s, int index, int part, List ans, String S) {
        if (part == 4 || index == s.length()) {
            if (part == 4 && index == s.length()) {
                ans.add(S);
            }
            return;
        }
        for (int i = index; i < s.length() && i < index + 3; i++) {
            if (s.charAt(index) == '0' && i > index) break;
            if (Integer.parseInt(s.substring(index, i + 1)) < 256) {
                dfsHelper(s, i + 1, part + 1, ans, 
                          S + (S.length() == 0 ? "" : ".") + s.substring(index, i + 1));
            }
        }
    }

中间一次的, 有点长,马马虎虎吧。

 public List restoreIpAddresses(String s) {
        List result = new ArrayList<>();
        helper(s, 0, 0, result, "");
        return result;
    }
    private void helper(String s, int n, int index, List result, String s2) {
        if (n == 3) {
            if (isValid(s.substring(index, s.length()))) {
                result.add(s2 + s.substring(index, s.length()));
            }
             return;
        }
        for (int i = index; i <= index + 2 && i + 1< s.length() ; i++) {
            if(isValid(s.substring(index, i + 1))) {
                helper(s, n + 1, i + 1, result, s2 + s.substring(index, i + 1) + ".");
            }
        }
        
    }
    private boolean isValid(String str) {
        if (str == null || str.length() == 0 || str.length() > 3 ) return false;
        if (str.length() > 1 && str.charAt(0) == '0') return false;
        int number = Integer.parseInt(str);
        if (number > 255) return false;
        return true;
    }

第一次的,简直是个渣,刚转行刷题半年左右时写的代码,简直不忍读. 过去这一年提高还是很多的。

    public List restoreIpAddresses(String s) {
        if(s.length() > 12 || s.length() < 4) return new ArrayList();
        List result = new ArrayList();
        for(int i = 1; i < 4;  i ++ ) {
            String s1 =  s.substring(0, i);
            if(s.length() - i > 9 || s.length() -i < 3) continue;
            if(!isValid(s1)) continue;
            StringBuilder sb = new StringBuilder();
            sb.append(s1);
            for(int j = 1; j < 4; j ++ ) {
                if(j + i + 2 > s.length() ) continue;
                if(j + i + 6 < s.length() ) continue;
                StringBuilder sb2 = new StringBuilder();
                sb2.append(sb.toString());
                String s2 = s.substring(i, i +j);
                if(!isValid(s2)) continue;
                sb2.append(".");
                sb2.append(s2);
                for(int k = 1; k < 4; k ++) {
                    if(j + i + k + 1 > s.length() ) continue;
                    if(j + i + k + 3 < s.length() ) continue;
                    String s3 = s.substring(i+j, i + j + k);
                    if(!isValid(s3)) continue;
                    StringBuilder sb3 = new StringBuilder();
                    sb3.append(sb2.toString());
                    
                    sb3.append(".");
                    sb3.append(s3);
                    String s4 = s.substring(i + j + k);
                    if(isValid(s4)) {
                        sb3.append(".");
                        sb3.append(s4);
                        result.add(sb3.toString());
                    }
                }
            }
        }
        return result;
    }
    private boolean isValid(String seg) {
        if(seg.length() > 1  && seg.charAt(0) == '0') return false;
        int a = Integer.parseInt(seg);
        if(a < 0 || a > 255) return false;
        return true;
    }

你可能感兴趣的:(93. Restore IP Addresses)