Restore IP Addresses
题目:
Given a string containing only digits, restore it by returning all possible valid IP address combinations.
分析:
这道题目有几个隐藏的考察点,
(1) 对substring的取出是否熟练
(2) 会不会string转化为int (stoi)
(3) 处理 "11111"容易,但是有没有考虑到"00000"这种变态情况?
(4) 按照section做,还是按照.做?方法1和方法2什么区别?
针对解法1,需要注意下列具体环节:
(1) 取sub str的方法是
string subIP(s.begin() + start, s.begin() + i + 1);
//or
string subIP = s.substr(start, i - start + 1);
(2) 在instance,size() == 4之后,判断退出的条件为start != s.size();表示有没有到结尾
(3) 在for循环里面加入i <= start + 3可以减少不必要的loop
解法1:
class Solution {
public:
    /**
     * @param s the IP string
     * @return All possible valid IP addresses
     */
    bool isValid(string subIP) {
        if (subIP[0] == '0' && subIP.size() > 1) {
            return false;
        }
        int subIPnum = stoi(subIP);
        if (subIPnum > 255) {
            return false;
        }
        return true;
    }
    void dfs(string s, vector<string> instance, vector<string>& res, int start) {
        if (instance.size() == 4) {
            if (start != s.size() ) {
                return;
            }
            res.push_back(instance[0] + "." + instance[1] + "." + instance[2] + "." + instance[3]);
            return;
        }
        for (int i = start; i < s.size() && i <= start + 3; i++) {
            string subIP(s.begin() + start, s.begin() + i + 1);
            if (!isValid(subIP) ) {
                continue;
            }
            instance.push_back(subIP);
            dfs(s, instance, res, i + 1);
            instance.pop_back();
        }
    }
    vector<string> restoreIpAddresses(string& s) {
        // Write your code here
        if (s.size() < 4 || s.size() > 12) {
            return vector<string>();
        }
        vector<string> res;
        vector<string> instance;
        dfs(s, instance, res, 0);
        return res;
    }
};
解法2:
class Solution {
public:
    /**
     * @param s the IP string
     * @return All possible valid IP addresses
     */
    string toIPStirng(vector<int> instance, string s) {
        // return to_string(instance[0]) + "." + to_string(instance[1]) + "." + to_string(instance[2]);
        string IP1 = s.substr(0, instance[0]);
        string IP2 = s.substr(instance[0], instance[1] - instance[0]);
        string IP3 = s.substr(instance[1], instance[2] - instance[1]);
        string IP4 = s.substr(instance[2], s.size() - instance[2]);
        return IP1 + "." + IP2 + "." + IP3 + "." + IP4;
    } 
    bool isValidIP(vector<int> instance, string s) {
        string subIP = s.substr(0, instance[0]);
        if (subIP.size() > 1 && subIP[0] == '0') {
            return false;
        }
        int numIP = 0;
        for (int i = 0; i < instance[0]; i++) {
            numIP *= 10;
            numIP += (s[i] - '0');
        }
        if (numIP > 255) {
            return false;
        }
        subIP = s.substr(instance[0], instance[1] - instance[0]);
        if (subIP.size() > 1 && subIP[0] == '0') {
            return false;
        }
        numIP = 0;
        for (int i = instance[0]; i < instance[1]; i++) {
            numIP *= 10;
            numIP += (s[i] - '0');
        }
        if (numIP > 255) {
            return false;
        }
        subIP = s.substr(instance[1], instance[2] - instance[1]);
        if (subIP.size() > 1 && subIP[0] == '0') {
            return false;
        }
        numIP = 0;
        for (int i = instance[1]; i < instance[2]; i++) {
            numIP *= 10;
            numIP += (s[i] - '0');
        }
        if (numIP > 255) {
            return false;
        }
        subIP = s.substr(instance[2], s.size() - instance[2]);
        if (subIP.size() > 1 && subIP[0] == '0') {
            return false;
        }
        numIP = 0;
        for (int i = instance[2]; i < s.size(); i++) {
            numIP *= 10;
            numIP += (s[i] - '0');
        }
        if (numIP > 255) {
            return false;
        }
        return true;
    } 
    void dfs(string s, vector<int> instance, vector<string>& res, int start) {
        if (instance.size() == 3) {
            if (isValidIP(instance, s) ) {
                res.push_back( toIPStirng(instance, s) );
            }
            return;
        }
        for (int i = start; i < s.size(); i++) {
            instance.push_back(i);
            dfs(s, instance, res, i + 1);
            instance.pop_back();
        }
    } 
    vector<string> restoreIpAddresses(string& s) {
        // Write your code here
        if (s.size() < 4 || s.size() > 12) {
            return vector<string>();
        }
        vector<string> res;
        vector<int> instance;
        dfs(s, instance, res, 1);
        return res;
    }
};