复原IP地址

题目

有效 IP 地址 正好由四个整数(每个整数位于 0255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。

  • 例如:"0.1.2.201""192.168.1.1"有效 IP 地址,但是 "0.011.255.245""192.168.1.312""192.168@1.1"无效 IP 地址。

给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。

思路

和切割回文串的问题异曲同工,但是需要注意每个整数位于 0255 之间组成,且不能含有前导 0,所以每次迭代只需要遍历前三个值

class Solution {
public:
    vector<string> res, vec;
    string ip_substr;
    void restoreIpAddressesAux(string s, int start_index, int iter)
    {
        for(int i = start_index; i < start_index + 3; ++i)
        {
            if(start_index >= s.size()) return;
            if(iter == 4)  ip_substr = s.substr(start_index);
            else ip_substr = s.substr(start_index, i - start_index + 1);
            //cout << ip_substr <<endl;
            if((ip_substr.size() >= 2 && ip_substr[0] == '0') || ip_substr.size() > 3 || stoi(ip_substr) > 255)  continue;
            if(iter != 4) vec.emplace_back(ip_substr+'.');
            else
            {
                vec.emplace_back(ip_substr);
                string s = "";
                for(auto elem : vec) s += elem;
                res.emplace_back(s);
                vec.pop_back();
                return;
            }
            restoreIpAddressesAux(s, i + 1, iter + 1);
            vec.pop_back();
        }

    }
    vector<string> restoreIpAddresses(string s) {
        restoreIpAddressesAux(s, 0, 1);
        return res;
    }
};

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top