您的位置:首页 > 其它

Restore IP Addresses

2015-04-13 05:29 225 查看
Given a string containing only digits, restore it by returning all possible valid IP address combinations.

For example:

Given 
"25525511135"
,

return 
["255.255.11.135", "255.255.111.35"]
. (Order does not matter)

这种扫描combination的挺多的,一般都是backtracking, 那么要考虑的:

1. 符合条件的解:  对于单个数字, 0-255之间,且 010为无效。 对于整个解,有四个数字构成且无剩余数字

2. 停止条件: 达到1 之后满足

3. 回溯: 这里我定式思维了一下。。。从index+1继续回溯,其实是i+1..., 总之还是push, 回溯, pop来做。。。。

<span style="color:#333333;">class Solution {
public:
vector<string> restoreIpAddresses(string s) {
vector<string> res;
vector<string> solution;
scanIp(s,0,res,solution);
return res;
}

private:
bool isValid(const string& s){
int n=s.size();
</span><span style="color:#ff0000;"> if (n==0 || n>3)
return false;
if (s[0]=='0' && n>1)
return false;
if (n==3 && atoi(s.c_str())>255)
return false;</span><span style="color:#333333;">
return true;
}

void scanIp(const string& s, int index, vector<string>& res, vector<string>& solution){
if (solution.size()==4){ // stopping condition, have 4 numbers
</span><span style="color:#ff0000;">if (index==s.size())</span><span style="color:#333333;">{ // there is not left numbers, otherwise, invalid
string tmp=solution[0];
for (int i=1; i<4; i++)
tmp=tmp+"."+solution[i];
res.push_back(tmp);
}
return;
}

string num;
for (int i=index; i<s.size()&& i<index+3; i++){
num.push_back(s[i]);
if (isValid(num)){
solution.push_back(num);
scanIp(s,</span><span style="color:#ff0000;">i+1</span><span style="color:#333333;">, res, solution);
solution.pop_back();
}
}
}
};
</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode