您的位置:首页 > 其它

Restore IP Addresses

2015-02-02 09:35 267 查看
public List<String> restoreIpAddresses(String s) {
List<String> res = new LinkedList<String>();
for(int i = 0; i < 3 && i + 1 <= s.length() - 3; i++){
String first = s.substring(0, i + 1);
if(first.length() > 1 && first.charAt(0) == '0')
continue;
Integer first_num = Integer.parseInt(first);
if(first_num > 255)
continue;
for(int j = 0; j < 3 && i + j + 2 <= s.length() - 2; j++){
String second = s.substring(i + 1, i + 1 + j + 1);
if(second.length() > 1 && second.charAt(0) == '0')
continue;
Integer sec_num = Integer.parseInt(second);
if(sec_num > 255)
continue;
for(int k = 0; k < 3 && i + j + k + 3 <= s.length() - 1; k++){
String third = s.substring(i + 1 + j + 1, i + 1 + j + 1 + k + 1);
if(third.length() > 1 && third.charAt(0) == '0')
continue;
Integer third_num = Integer.parseInt(third);
if(third_num > 255)
continue;
String forth = s.substring(i + j + k + 3);
if(forth.length() > 1 && forth.charAt(0) == '0' || forth.length() > 3)
continue;
Integer forth_num = Integer.parseInt(forth);
if(forth_num > 255)
continue;
String cur_res = first_num + "." + sec_num + "." + third_num + "." + forth_num;
res.add(cur_res);
}
}
}
return res;
}

https://oj.leetcode.com/problems/restore-ip-addresses/
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)

这一题主要是比较繁琐,各种恶心的条件比较多。总的来说是不能有重复结果,另外,四段里面每一段的有效范围都是0~255,注意搜索的时候不能越界,也必须要给每一段保留至少一个字符。另外还需要注意的一种情况就是数字有效性的判断,如果你像我一样用Integer.parseInt来处理的话。"001"和“01”都会被解析成1,但在这里不是合理的,因为任何一个字符都不能因为parse而被省略。所以最后给出代码如下:

2017-12-26 Updated:

呃。之前没有自己回顾这一道题。代码放在了最上端。重新看这道题目的时候会觉得这一题目用for loop代码看上去特别的不简洁和难懂。相比之下用递归会显得更加易懂而且容易维护,算法上并没有差异,只是边界条件的判断用了更加泛用的方式。特别是如果用在别的场合需要做五段六段甚至更多的判断的时候,就需要加以更多的for循环代入,在代码的可延伸性上for loop也显得特别差。所以给出下面用recursion的代码

public List<String> restoreIpAddresses(String s) {
List<String> result = new LinkedList<String>();
LinkedList<String> resultArr = new LinkedList<String>();
ipAddressRecur(result, resultArr, s, 1, 4);
return result;
}

private void ipAddressRecur(List<String> result, LinkedList<String> resultArr, String s, int curLayer, int maxLayer) {
if (curLayer > maxLayer) {
StringBuilder builder = new StringBuilder();
for(String str : resultArr) {
if (builder.length() == 0) {
builder.append(str);
} else {
builder.append("." + str);
}
}
result.add(builder.toString());
} else {
for (int i = 1; i <= 3; i++) {
if (s.length() - i >= (maxLayer - curLayer) && s.length() - i <= (maxLayer - curLayer) * 3) {
String substr = s.substring(0, i);
Integer value = Integer.parseInt(substr);
//(i == 1 || value >= Math.pow(10, i - 1) 的判断在于避免"010"或者"01"之类的情况
if (value < 256 && (i == 1 || value >= Math.pow(10, i - 1))) {
resultArr.add(substr);
ipAddressRecur(result, resultArr, s.substring(i), curLayer + 1, maxLayer);
resultArr.removeLast();
}
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: