思路:首先应该对IP地址有一定的了解。IP地址是由32位二进制数表示的,为了方便,通常将32位二进制数分为4段,然后将每一段表示成为0到255的十进制数,即通常我们会看到的:XXX.XXX.XXX.XXX。每一段的数字可以有一位、两位或三位,范围是[0,255]。但是需要注意:当只有一位是可以为0,当有两位或三位时不能为0,即像 00, 01, 001, 011, 000等都是不合法的。
对IP地址有了一定的了解后,再看本题的要求,求解各种可能情况的问题,一般都会考虑到递归调用。所以本题用k来记录还剩几段没有划分,当k=0时,输出可能的结果。用isValue来判断当前划分的字符串,是否在区间[0,255]中。具体代码如下:
class Solution {
public:
vector restoreIpAddresses(string s) {
vector ans;
restore(s,4,"",ans);
return ans;
}
void restore(string s,int k,string tmp,vector &ans)
{
if(k==0)
{
if(s.empty()) ans.push_back(tmp);
}
else
{
for(int i=1;i<=3;++i)
{
if(s.size()>=i&&isValue(s.substr(0,i)))
{
if(k==1) restore(s.substr(i),k-1,tmp+s.substr(0,i),ans);
else restore(s.substr(i),k-1,tmp+s.substr(0,i)+".",ans);
}
}
}
}
bool isValue(string s)
{
if(s.empty()||s.size()>3||(s.size()>1&&s[0]=='0')) return false;
int m=atoi(s.c_str());
return m<=255&&m>=0;
}
};