复原IP地址
-
- [题解1 回溯(同分割回文字符串)](#题解1 回溯(同分割回文字符串))
有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。
例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效 IP 地址。
给定一个只包含数字 的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。
示例 1:
输入:s = "25525511135"
输出:["255.255.11.135","255.255.111.35"]
示例 2:
输入:s = "0000"
输出:["0.0.0.0"]
示例 3:
输入:s = "101023"
输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]
提示:
- 1 <=
s.length
<= 20 s
仅由数字组成
题解1 回溯(同分割回文字符串)
cpp
class Solution {
vector<string> ret;
// 存每一段
vector<string> tmp;
public:
//把4个部分连接到一起
string joinstr(vector<string> k){
string res = "";
for(int i = 0; i < k.size(); i ++){
res += k[i];
// 最后一部分不加.
if(i < k.size()-1)
res+=".";
}
return res;
}
// 判断某一段是否合法
bool isvalid(string s, int start, int end){
int l = end-start+1;
// 长度限制
if(l > 3 || l == 0) return false;
// 首字符不能是0
if(l > 1 && s[start] == '0') return false;
// 段值限制
if(stoi(s.substr(start, l)) > 255) return false;
return true;
}
// idx是IP每段的开始
void traceback(string s, int idx){
if(idx == s.size() && tmp.size() == 4){
ret.push_back(joinstr(tmp));
return;
}
for(int i = idx; i < s.size(); i++){
if(! isvalid(s, idx, i)) continue;
if(tmp.size() > 4) break;
string str = s.substr(idx, i-idx+1);
tmp.push_back(str);
traceback(s, i+1);
tmp.pop_back();
}
}
vector<string> restoreIpAddresses(string s) {
// 长度范围
int len = s.size();
if(len > 12) return vector<string>();
// 回溯
traceback(s, 0);
return ret;
}
};