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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对于仅包含数字的给定字符串,返回所有有效IP地址组合的最佳方法是什么?相关的知识,希望对你有一定的参考价值。

例:

鉴于“25525511135”

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

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

答案

为什么采用“最佳”方法来回答这个问题很重要?

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

无论这是什么,它都不可能成为瓶颈。

另一答案

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

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

另一答案

在这个问题上可以接受残酷的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;
    }
};
另一答案

Herejavascript的递归解决方案。结果未排序。

// 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');    
})();

以上是关于对于仅包含数字的给定字符串,返回所有有效IP地址组合的最佳方法是什么?的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode No.93 复原 IP 地址(DFS)

Leetcode No.93 复原 IP 地址(DFS)

(回溯法)Java 求解复原 IP 地址

《LeetCode之每日一题》:103.复原 IP 地址

LeetCode 93. 复原IP地址

2021-09-16:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。按键2对应:‘