92.复原IP地址

题目
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。

示例:

输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]

思路
1、采用暴力法进行遍历,将IP分成四段,设置一个check函数检查当前ip是否满足要求,只有四段都满足要求才能通过。

#include <vector>
#include <string>
using namespace std;
class Solution {
public:
    vector<string> restoreIpAddresses(string s) {
        vector<string> result;
        if (s.size() > 12) return result;
        for (int i = 0; i < s.size(); i++)
        {
            for (int j = i + 1; j < s.size(); j++)
            {
                for (int k = j + 1; k < s.size() - 1; k++)
                {
                    string ip1 = s.substr(0, i + 1);
                    string ip2 = s.substr(i + 1, j - i);
                    string ip3 = s.substr(j + 1, k - j);
                    string ip4 = s.substr(k + 1);
                    if (check(ip1) && check(ip2) && check(ip3) && check(ip4))
                    {
                        string ip = ip1 + "." + ip2 + "." + ip3 + "." + ip4;
                        result.push_back(ip);
                    }
                }
            }
        }
        return result;
    }
    bool check(string ip)
    {
        int value = stoi(ip); // string -> int
        if (ip.at(0) == '0')
        {
            return (ip.size() == 1);
        }
        else
        {
            if (value <= 255) return true;
            else return false;
        }
    }

};

int main(int argc, char* argv[])
{
    string IP = "25525511135";
    vector<string> out = { "255.255.11.135", "255.255.111.35" };
    auto res = Solution().restoreIpAddresses(IP);
    return 0;
}

2、利用迭代法,一段一段生成IP,直到生成所有的四段IP

//迭代法
class soulution
{
public:
    vector<string> restoreIpAddresses(string s)
    {
        vector<string> result;
        if (s.size() > 12 || s.size() < 4)
        {
            return result;
        }
        restore(s, 4, "", result);
        return result;

    }

    void restore (string s, int k, string str, vector<string>& result)
    {
        if (k == 0 && s.empty()) result.push_back(str);
        else
        {
            for (int i = 1; i <= 3; i++)
            {
                if (s.size() >= i && isIPvalid(s.substr(0, i)))
                {
                    restore(s.substr(i), k - 1, str + s.substr(0, i) + (k == 1 ? "" : "."), result);
                }
            }
        }
    }

    bool isIPvalid(string str)
    {
        if (str.size() > 1 && str.at(0) == '0' || stoi(str) > 255 || stoi(str) < 0)
        {
            return false;
        }
        return true;
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容