93. Restore IP Addresses

问题描述:

 

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"]

解题思路:

这个就是枚举并且判断是否是有效的。

核心的地方是:IP地址有4各部分,每个部分都要小于256,即[0, 255]。

我们可以从以下几个地方入手:

1.当前剩余字符串长度是否超过所给的最大长度? (1,2,3,4)

  每个部分最长为3,若在对第1部分进行枚举,剩下的长度如果超过了3*3那么显然是不可能的

2.当前部分字符串传承数字后的值是否在有效范围内?

需要注意的是:

  若当前字符串长度大于1且开头为0,是无效的:如01

代码:

class Solution {
public:
    vector<string> restoreIpAddresses(string s) {
        vector<string> ret;
        int len = s.size();
        if(len > 12)
            return ret;
        enumerate(ret, s, 4, "");
        return ret;
    }
private:
    void enumerate(vector<string> &ret, string s, int part, string cur){
        if(part == 1){
            if(validAdd(s)){
                cur += s;
                ret.push_back(cur);
            }
            return;
        }
        for(int i = 1; i <= 3 && i < s.size(); i++){
            string temp = cur;
            string add = s.substr(0, i);
            if(validAdd(add)){
                temp += add+".";
                string rest = s.substr(i);
                if(rest.size() <= ((part-1)*3))
                    enumerate(ret, rest, part-1, temp);
            }
        }
    }
    
    bool validAdd(string s){
        if(s.size() > 3)
            return false;
        if(s.size() > 1 && s[0] == '0')
            return false;
        int num = 0;
        for(int i = 0; i < s.size(); i++){
            num *= 10;
            num += s[i]-'0';
        }
        return num < 256;
    }
};
原文地址:https://www.cnblogs.com/yaoyudadudu/p/9162124.html