回溯算法-----復原IP地址(Java版本)

題目

給定一個只包含數字的字符串,復原它並返回所有可能的 IP 地址格式。

有效的 IP 地址正好由四個整數(每個整數位於 0 到 255 之間組成),整數之間用 '.' 分隔。

 

示例:

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

解決方法

    //回溯用
    LinkedList<String> linkedList = new LinkedList<>();
    //保存結果用
    List<String> result = new ArrayList<>();

    public List<String> restoreIpAddresses(String s) {
        dfs(s,0,0);
        return result;

    }

    public void dfs(String string,int dort,int curIndex){
        //判斷點的個數 如果是3個點 都滿足 那麼就是真的ip地址 
        // 回溯   結束的條件 就是具備三個點
        //對於每一個點  各種情況  如果說其中有一個後續直接不滿足 回溯

        //如果當前的index 超過了字符串的長度  返回
        if (curIndex >= string.length()) {
            return;
        }

        //如果當前的字符串是0 那麼後面就不能增加字符串了,因爲不能出現01.01.01.01 這種
        int max = string.charAt(curIndex) == '0' ? 1 : 3;
        for (int i = 1; i <= max; i++) {
            //保證不要超過整個字符串大小
            if (curIndex + i > string.length()) {
                continue;
            }
            //截取字符串
            String substring = string.substring(curIndex, curIndex + i);
            //如果是合理的字符串 (0<x <255)
            if (!isInvalidate(substring)) {
                continue;
            }
            //增加
            linkedList.add(substring);

            //如果是第三個點 那麼就是結束的時候了
            if (dort == 3) {
                //如果當前的長度是整個數組的長度 那麼就是結束的時候了
                if (curIndex + substring.length() == string.length()) {
                    //添加結果
                    String join = String.join(".", linkedList);
                    result.add(join);

                }
            }else {
                //如果不是最後一個點  那麼添加下一個點
                dfs(string,dort + 1,curIndex + substring.length());
            }
            //回溯
            linkedList.pollLast();
        }

    }
    public boolean isInvalidate(String string){
        return string.length() <= 3  && Integer.parseInt(string) <= 255;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章