题目
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
示例:
输入: “25525511135”
输出: [“255.255.11.135”, “255.255.111.35”]
解题思路
记录每次放入的ip节,对字符串其进行回溯,即每次放入前1-3个数字,一直深度即可。
需要注意的是:
1.如果第1个数字是0的话可以直接剪枝(必须,不然会解答错误,因为ip节可能出现00这种情况)。
2.如果s的长度大于还未放入的ip节数*3可以剪枝。
3.放入4个之后即count==0,如果s不为空,则不用继续深度搜索。
代码如下
//93. 复原IP地址
public List<String> restoreIpAddresses(String s) {
ArrayList<String> res = new ArrayList<>();
dfs(res, 4, s, new StringBuilder(16));
return res;
}
public void dfs(List<String> list, int count, String s, StringBuilder ip){
// 大于最大的长度
if(s.length() > 3 * count) return;
//ip中已经放入4个时
if(count == 0){
if(s.isEmpty()) {
//去掉最后多的“”"."
list.add(ip.substring(0,ip.length()-1));
}
return;
}
for(int i = 1; i <= 3 && i <= s.length(); i ++){
String tmp = s.substring(0,i);
if(Integer.parseInt(tmp) <= 255){
int len = ip.length();
ip.append(tmp);
ip.append(".");
dfs(list, count-1, s.substring(i), ip);
ip.delete(len, ip.length());
if(tmp.equals("0")){
break;
}
}
else {
break;
}
}
}
提交结果
成功
显示详情
执行用时 : 5 ms, 在Restore IP Addresses的Java提交中击败了73.10% 的用户
内存消耗 : 35.2 MB, 在Restore IP Addresses的Java提交中击败了77.65% 的用户