[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
return
思路:
遇到这种求所有符合要求的结果的题目,可以首先想到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;
}
};
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;
}
};
相关文章推荐
- [leetcode] 93. Restore IP Addresses 解题报告
- LeetCode 93. Restore IP Addresses 解题报告
- LeetCode解题报告—— Reverse Linked List II & Restore IP Addresses & Unique Binary Search Trees II
- [LeetCode] Restore IP Addresses 解题报告
- [LeetCode] Restore IP Addresses 解题报告
- 【LeetCode】Restore IP Addresses 解题报告
- [LeetCode]Restore IP Addresses, 解题报告
- Restore IP Addresses [Leetcode 解题报告]
- 【leetcode】93. Restore IP Addresses【java】
- [Leetcode] 93. Restore IP Addresses
- [LeetCode] 93. Restore IP Addresses 复原IP地址
- LeetCode93. Restore IP Addresses
- LeetCode 93. Restore IP Addresses
- leetCode 93.Restore IP Addresses (恢复IP地址) 解题思路和方法
- [LeetCode] 93. Restore IP Addresses
- * Leetcode 93. Restore IP Addresses
- leetcode 93. Restore IP Addresses
- leetcode-93. Restore IP Addresses
- LeetCode-93. Restore IP Addresses
- Leetcode: 93. Restore IP Addresses