题目
给定一个只包含数字的字符串,复原它并返回所有可能的 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;
}
};