题目
有效 IP 地址 正好由四个整数(每个整数位于 0
到 255
之间组成,且不能含有前导 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
中的任何数字。你可以按 任何 顺序返回答案。
思路
和切割回文串的问题异曲同工,但是需要注意每个整数位于 0
到 255
之间组成,且不能含有前导 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;
}
};