对于仅包含数字的给定字符串,返回所有有效IP地址组合的最佳方法是什么?

时间:2016-07-19 12:48:24

标签: algorithm graph graph-algorithm

示例:

鉴于“25525511135”

输出:[“255.255.11.135”,“255.255.111.35”]。 (排序顺序)

如果我们可以在这里进行深度优先搜索,请告诉我?(这是唯一令我震惊的事情)

4 个答案:

答案 0 :(得分:1)

为什么选择最佳的'回答这个问题的方法?

没有多少排列,所以检查适合IP格式的每个组合的简单方法,然后过滤掉那些超出范围数字的组合将很容易。

对于这一部分而言,它不太可能成为瓶颈。

答案 1 :(得分:0)

你可能想要一般情况下的动态编程算法(类似于 http://www.geeksforgeeks.org/dynamic-programming-set-32-word-break-problem/)。

您可以测试前缀是否是某些有效IPv4地址的前缀,而不是测试前缀是否可以分割为字典中的单词。

答案 2 :(得分:0)

这个问题可以接受残酷的DFS:

class Solution{
private:
    vector<string> ans;
    int len;
    string cur, rec, str;

    bool IsOk(string s) {
        if(s[0] == '0' && s.size() > 1) return false;
        int sum = 0;
        for(int i = 0; i < s.size(); i ++) {
            if(s[i] == '.') return false;
            sum = sum * 10 + s[i] - '0';
        }
        if(sum >= 0 && sum <= 255) return true;
        return false;
    }

    void dfs(int x, int cnt) {
        if(x == len) {
            if(str.size() != len + 4) return ;
            string tmp(str);
            tmp.erase(tmp.size() - 1, 1);
            if(cnt == 4) ans.push_back(tmp);
            return ;
        }
        if(cnt > 4 || str.size() > len + 4) return ;
        string tmp = cur;
        cur += rec[x];
        if(!IsOk(cur)) {
            cur = tmp;
            return ;
        }
        dfs(x + 1, cnt);

        string tmp2 = cur + '.';
        str += tmp2;
        cur = "";
        dfs(x + 1, cnt + 1);
        str.erase(str.size() - tmp2.size(), tmp2.size());
        cur = tmp;
    }

public:
    vector<string> restoreIpAddresses(string s) {
        this->len = s.size();
        this->rec = s;
        cur = str = "";
        ans.clear();
        dfs(0, 0);
        return ans;
    }
};

答案 3 :(得分:-1)

Here是JavaScript的递归解决方案。结果没有排序。

// Task from https://www.geeksforgeeks.org/program-generate-possible-valid-ip-addresses-given-string/
// Given a string containing only digits, restore it by returning all possible valid IP address combinations.
//
// Example:
// Input : 25525511135
// Output : [“255.255.11.135”, “255.255.111.35”]
//

(function () {
    function getValidIP(str) {
        const result = [];
        const length = str.length;

        check(0, 0, '');

        function check(start, level, previous){
            let i = 0;
            let num;

            if (level === 3) {
                num = str.substring(start);
                if (num && num < 256) {
                    result.push(`${previous}.${num}`);
                }
                return;                
            }
            num = str.substring(start, start + 1);
            if (num == 0) {
                check(start + 1, level + 1, level === 0 ? `${num}`: `${previous}.${num}`);
            } else {
                while (num.length < 4 && num < 256 && start + i + 1 < length) {
                    check(start + i + 1, level + 1, level === 0 ? `${num}`: `${previous}.${num}`);
                    i++;
                    num = str.substring(start, start + i + 1);
                }
            }
        }

        return result;
    }

    console.log('12345:')
    console.time('1-1');
    console.log(getValidIP('12345'));
    console.timeEnd('1-1');    

    console.log('1234:')
    console.time('1-2');    
    console.log(getValidIP('1234'));
    console.timeEnd('1-2');    

    console.log('2555011135:')
    console.time('1-3');
    console.log(getValidIP('2555011135'));
    console.timeEnd('1-3');    

    console.log('222011135:')
    console.time('1-4');
    console.log(getValidIP('222011135'));
    console.timeEnd('1-4');    
})();