题目描述:
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
示例:
输入: “25525511135”
输出: [“255.255.11.135”, “255.255.111.35”]
递归+回溯
代码:
public List<String> restoreIpAddresses(String s) {
List<String> list = new ArrayList<>();
if (s == null || s.length() == 0) {
return list;
}
//sb是一个临时结果,当其满足条件时,才会被加入到最终的list中.
StringBuilder sb = new StringBuilder();
getRes(0, sb, list, s);
return list;
}
// k表示的是生成几段
public void getRes(int k, StringBuilder sb, List<String> list, String s) {
if (k == 4 || s.length()==0) {
//如果k==4并且s.length==0说明给定的字符串被我们分成了合理的四段,
//并且没有剩余的字符,此时sb就是一个结果,加入到list中.
if (k==4 && s.length()==0) {
list.add(sb.toString());
}
return;
}
for (int i = 0; i < s.length() && i <= 2; i++) {
//下面这个if循环是为了避免出现类似于0.1.001.0这种结果.
if (i != 0 && s.charAt(0)=='0') {
break;
}
//从s中截取后一段数字.
String tmp = s.substring(0, i+1);
//首先判断刚才截取的这段数字是否<=255,若满足,则进入if判断中.
if (Integer.valueOf(tmp) <= 255) {
//如果此时临时结果sb的长度不为0,说明我们往sb后面拼凑的数字应该是.+数字这种形式,
// 而不是直接拼接数字.
if (sb.length() != 0) {
tmp = "." + tmp;
}
sb.append(tmp);
//k+1, 再把s从第i+1位截取到最后,得到新的s,进行递归.
getRes(k+1, sb, list, s.substring(i+1));
//把上面append进来的tmp删掉,从sb长度的第sb.length()-tmp.length()位开始,
// 一直删除到最后.
sb.delete(sb.length()-tmp.length(), sb.length());
}
}
}