#include <vector>
class Solution {
  public:
    bool isValid(const string& s) {
        if (s.empty() || s.length() > 3 || (s.length() > 1 && s[0] == '0')) {
            return false;
        }
        int num = 0;
        for (int i = 0; i < s.length(); i++) {
            num = num * 10 + s[i] - 48;
        }
        return num >= 0 && num <= 255;
    }
    vector<string> solve(string s, int depth) {
        vector<string> res;
        if (depth == 3) {
            if (isValid(s)) {
                res.push_back(s);
            }
            return res;
        }
        for (int i = 0; i < 3 && i < s.length(); i++) {
            if ((i > 0 && s[0] == '0') || (i == 2 && !isValid(s.substr(0, i + 1)))) {
                break;
            }
            for (auto c : solve(s.substr(i + 1, string::npos), depth + 1)) {
                c.insert(0, s.substr(0, i + 1) + ".");
                res.push_back(c);
            }
        }
        return res;
    }
    vector<string> restoreIpAddresses(string s) {
        vector<string> res = solve(s, 0);
        return res;
    }
};