93. Restore IP Addresses[DFS]

NAIVE 解法,O(n3):

    public List<String> restoreIpAddresses(String s) {
        int len = s.length();
        List<String> 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這個(gè)條件可以少循環(huán)很多次
        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解法我寫了一個(gè),我想的是類似Combination Sum那種的;但是運(yùn)行時(shí)報(bào)錯(cuò)outOfRange -1。但是不知道哪里有錯(cuò)。而且,我不知道這個(gè)思路哪里有問題。遞歸還是難。先貼這兒:

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

    private void dfs(String s, List<String> 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;
    }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,769評(píng)論 0 33
  • LeetCode 刷題隨手記 - 第一部分 前 256 題(非會(huì)員),僅算法題,的吐槽 https://leetc...
    蕾娜漢默閱讀 17,920評(píng)論 2 36
  • 參考兩篇其他bolg總結(jié)的二叉樹:https://github.com/xy7313/lintcode/blob/...
    暗黑破壞球嘿哈閱讀 2,403評(píng)論 0 1
  • 分治策略 本文包括分治的基本概念二分查找快速排序歸并排序找出偽幣棋盤覆蓋最大子數(shù)組 源碼鏈接:https://gi...
    廖少少閱讀 1,893評(píng)論 0 7
  • 明天開始小伙伴們一起休假出行。今天最重要的事情就是收拾東西,買買買,再收拾東西。要去的泰國(guó)會(huì)非常熱,我們要把夏天的...
    榛子客閱讀 236評(píng)論 0 0