IP地址格式:X.X.X.X(0<=X<=255),例如172.10.255.0
主要需注意的几个点:对‘0’的处理,不能出现001,010等0为首位的情况(但0可以单独存在(X.0.X.X是合法的));注意三位数的大小不能超过255,超过即为非法。
时间复杂度:O(N)
C++代码:
class Solution {
public:
vector<string> result;
vector<string> restoreIpAddresses(string &s) {
addDot(s, 4, 0);
return result;
}
void addDot(string &s, int count, int pos)
{
if (s.length() - pos > 3 * count)//剪枝,当点的个数加一少于数字的三分之一时便不可能
return; //出现合法情况(比如后面还有7个数但只剩1个点就不可能
else //出现合法分割)
{
int num = 0;
for (int i = 1; i <= 3; i++)
{
if (pos + i > s.length())
break;
num *= 10;
num += s[pos + i - 1] - '0';
if (num > 255)
return;
if (count != 1)
{
if (pos + i == s.length())
break;
s.insert(s.begin() + pos + i, '.');
addDot(s, count - 1, pos + i + 1);
s.erase(s.begin() + pos + i);
if (i == 1 && s[pos] == '0')
return;
}
if (i == 1 && s[pos] == '0'&&pos != s.length() - 1)
return;
}
if (count == 1)
result.push_back(s);
}
}
};