93. Restore IP Addresses[DFS]

NAIVE 解法,O(n3):

    public List restoreIpAddresses(String s) {
        int len = s.length();
        List res = new ArrayList<>();
        if (len < 4 || len > 12) return res;
//      for (int i = 1; i < len - 2; i++)
//          for (int j = i + 1; j < len - 1; j++)
//              for (int k = j + 1; k < len; k++) {
//      加上j < i + 4这个条件可以少循环很多次
        for (int i = 1; i < 4 && i < len - 2; i++)
            for (int j = i + 1; j < i + 4 && j < len - 1; j++)
                for (int k = j + 1; k < j + 4 && k < len; k++) {
                    if (isValid(s.substring(0, i))
                            && isValid(s.substring(i, j))
                            && isValid(s.substring(j, k))
                            && isValid(s.substring(k, len))) {
                        String seg = s.substring(0, i) + "." + s.substring(i, j) + "." + s.substring(j, k) + "." + s.substring(k, len);
                        res.add(seg);
                    }
                }
        return res;
    }

    private boolean isValid(String s) {
        if (s.length() > 3) return false;
        if (s.length() > 1 && s.charAt(0) == '0') return false;
        return Integer.parseInt(s) <= 255;
    }

dfs

dfs解法我写了一个,我想的是类似Combination Sum那种的;但是运行时报错outOfRange -1。但是不知道哪里有错。而且,我不知道这个思路哪里有问题。递归还是难。先贴这儿:

    public List restoreIpAddresses(String s) {
        int len = s.length();
        List res = new ArrayList<>();
        if (len < 4 || len > 12) return res;
        dfs(s, res, 0, 0, "");
        return res;
    }

    private void dfs(String s, List res, int count, int idx, String ans) {
        if (count == 4 && idx == s.length() - 1) {
            res.add(ans);
        }
        for (int i = idx; i < s.length(); i++) {
            if (idx > s.length()) break;
            if (!isValid(s.substring(i, idx + 1))) continue;
            ans += s.substring(i, idx + 1);
            dfs(s, res, ++count, ans.length(), ans);
        }

    }

    private boolean isValid(String s) {
        if (s.length() == 0 || s.length() > 3) return false;
        if (s.length() > 1 && s.charAt(0) == '0') return false;
        return Integer.parseInt(s) <= 255;
    }

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