class Solution {
public:
vector<string> restoreIpAddresses(string s) {
vector< string > ans={};
string temp="";
int count=0;
dp(0, s, ans, temp, 0);
return ans;
}
void dp(int index, string& s, vector<string>& ans, string& temp, int count){
if( count == 4 && index == s.size()){ //完成
temp.pop_back(); //弹出最后的点
ans.push_back(temp);
return;
}
if(count>= 4 || index >= s.size()){ //当达到节数却没有达到最后,或者超过字符串却没有达到节数;
return;
}
for(int i=index; i<=index+2 && i<s.size() ; i++){ //
string sub_s = s.substr(index, i-index+1);
if(sub_s.size() > 1 && sub_s.front() == '0'){ //0x、00,当出现前导0并且大于一位时,数字不符合规则;
return;
}
int val_sub_s = stoi(sub_s); //获得数字
if(val_sub_s <= 255 ){
temp = temp + sub_s + ".";
}else{ //超出每节的范围
continue;
}
count++;
dp(i+1, s, ans, temp, count);
//回溯
count--;
temp.pop_back(); //弹出点
while(!temp.empty() && temp.back() != '.'){ //弹出数字
temp.pop_back();
}
}
return;
}
};