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();
}
}
}
}
}
相关文章推荐
- Restore IP Addresses -- LeetCode
- LeetCode Restore IP Addresses
- leetcode---Restore IP Addresses---回溯
- Restore IP Addresses
- Restore IP Addresses
- Restore IP Addresses
- Restore IP Addresses -- LeetCode
- Leetcode--Restore IP Addresses
- Restore IP Addresses
- LeetCode: Restore IP Addresses [093]
- LeetCode93——Restore IP Addresses
- Restore IP Addresses
- [leetcode刷题系列]Restore IP Addresses
- [leetcode]Restore IP Addresses
- leetcode第一刷_Restore IP Addresses
- LeetCode *** 93. Restore IP Addresses
- LeetCode 10.6 Restore IP Addresses
- [LeetCode]-Restore IP Addresses
- LeetCode 93 Restore IP Addresses
- Leetcode: Restore IP Addresses