思路:
注意的地方:
去掉前缀0的ip,但允许单个0;
即:0.0.0.1允许;00.0.0.1不允许。
要剪枝,判断下面剩下的数字的个数能否构成全是3位的ip 或 全是1位的ip,否则MLE;
class Solution {
private:
void dfs(string s, string ip, vector<string> &res, int step, size_t cur) {
if(cur == s.size() && step == 4) {//end condition
ip.resize(ip.size()-1);//get rid of the last "."
res.push_back(ip);
return;
}
if(s.size() - cur > (4 - step)*3) return;//cut
if(s.size() - cur < (4 - step)) return;//cut
int num = 0;
for(size_t i = cur; i < cur + 3; ++i) {
num = num*10 + s[i]-'0';
if(num < 256) {
ip+=s[i];
dfs(s, ip+'.', res, step+1, i+1);
}
if(num == 0) break;
}
}
public:
vector<string> restoreIpAddresses(string s) {
vector<string> res;
string ip;
dfs(s,ip,res,0,0);
return res;
}
};