题目描述
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]
解题思路
此题最常规的做法是回溯法,但是本题是有“奇技淫巧”的。
- 回溯法(这种方法必会):就是一般字符串的“回溯”方法,注意剪枝。
- 首先明确:每段数字的长度只能是
1~3
。所以我们在每个位置pos
取子串的时候,有三种选择。 - 递归出口:我们已经取了四段数字且此时的
pos == str.length()
,我们可以在此时“结算”。 - 剪枝条件:每段数字不能以
0
开头,且不能大于255
。
- 首先明确:每段数字的长度只能是
- 奇技淫巧(枚举,依次循环判断即可)
我的实现
class Solution {
public:
vector<string> restoreIpAddresses(string str) {
vector<string> ip;
length = str.size();
if(length < 4)
return res;
backtracking(str, 0, ip);
return res;
}
void backtracking(string &str, int pos, vector<string> &ip){
if(ip.size() == 4){
if(pos == str.size()){
string temp = "";
for(int i = 0; i <= 3; i++)
temp += i == 3? ip[i]: ip[i]+'.';
res.push_back(temp);
}
return;
}
for(int i = 1; i <= 3; i++){ // 每段数字只能是1~3位
if(pos + i - 1 < str.size()){
string temp_str = str.substr(pos, i);
int temp_num = stoi(temp_str);
if(to_string(temp_num).size() != i || temp_num > 255) // 剪枝:数字位数大于1且以0开头, 或者数字大于255
continue;
// dfs(回溯)
ip.push_back(temp_str);
backtracking(str, pos + i, ip);
ip.pop_back();
}
}
}
private:
int length;
vector<string> res;
};