您的位置:首页 > 其它

[Leetcode] 93. Restore IP Addresses 解题报告

2017-04-19 10:06 465 查看
题目

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)
思路

遇到这种求所有符合要求的结果的题目,可以首先想到backtracking,因为backtracking的特征就是在找到一个结果之后,通过回溯再找下一个结果,直到找到所有结果。对于本题目而言,我们的目标就是找出四个索引位置,使得在这四个位置插入逗号之后,分割出来的整数的范围均处于0~255。我们可以在当前节点,依次判断后面1\2\3位数字所组成的整数的范围是否处于0~255,如果是,则继续深搜,直到得到符合要求的结果。当然关键点是在于在判断完成一个结果之后,记得回溯。

代码

class Solution {
public:
vector<string> restoreIpAddresses(string s) {
vector<int> indices;
indices.push_back(0);
vector<string> ret;
restoreAddresses(s, ret, indices);
return ret;
}
private:
void restoreAddresses(const string &s, vector<string> &ret, vector<int> &indices) {
if(indices.size() == 4) {
if(numValid(s, indices[3], s.length() - 1)) {
string address;
address += s.substr(indices[0], indices[1] - indices[0]);
address += ".";
address += s.substr(indices[1], indices[2] - indices[1]);
address += ".";
address += s.substr(indices[2], indices[3] - indices[2]);
address += ".";
address += s.substr(indices[3], s.length() - indices[3]);
ret.push_back(address);
}
return;
}
for(int i = 1; i <= 3; ++i) {
int next_index = indices[indices.size() - 1] + i;
if(next_index < s.length()) {
if(numValid(s, indices[indices.size() - 1], next_index - 1)) {
indices.push_back(next_index);
restoreAddresses(s, ret, indices);
indices.pop_back(); // backtracking
}
}
else {
return;
}
}
}
bool numValid(const string &s, int start, int end) {
if(end - start >= 1 && s[start] == '0') {
return false;
}
else if(end - start >= 3) {
return false;
}
int ret = 0; // be carefull the overflow
for(int i = start; i <= end; ++i) {
ret = 10 * ret + s[i] - '0';
}
return ret <= 255;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: