https://oj.leetcode.com/problems/restore-ip-addresses/
这道题的解法非常接近于NP问题,也是采用递归的解法。基本思路就是取出一个合法的数字,作为IP地址的一项,然后递归处理剩下的项。可以想象出一颗树,每个结点有三个可能的分支(因为范围是0-255,所以可以由一位两位或者三位组成)。并且这里树的层数不会超过四层,因为IP地址由四段组成,到了之后我们就没必要再递归下去,可以结束了。这里除了上述的结束条件外,另一个就是字符串读完了。可以看出这棵树的规模是固定的,不会像平常的NP问题那样,时间复杂度取决于输入的规模,是指数量级的,所以这道题并不是NP问题,因为他的分支是四段,有限制。
ref: http://blog.csdn.net/linhuanmars/article/details/24683699
这是九章算法的官方解答:
http://answer.ninechapter.com/solutions/restore-ip-addresses/
这是我自己写了一次:
public class Solution {
public List
restoreIpAddresses(String s) {
ArrayList
rst = new ArrayList
();
help(s, 0, rst, new ArrayList
(), 0);
return rst;
}
// level: indicate how many levels we come to.
public void help(String s, int level, ArrayList
result, ArrayList
list, int index) { if (level == 4) { if (index != s.length()) { // if level = 4 and the string is not end, don't need to iterate again. return; } StringBuilder sb = new StringBuilder(); for (int i = 0; i < 4; i++) { sb.append(list.get(i)); if (i != 3) { sb.append('.'); } } result.add(sb.toString()); } for (int i = index; i < s.length() && i < index + 3; i++) { String tmp = s.substring(index, i + 1); list.add(tmp); if (isValid(tmp)) { help(s, level + 1, result, list, i + 1); } list.remove(list.size() - 1); } } public boolean isValid(String s) { if (s.charAt(0) == '0') { return s.equals("0"); // 00, 010 is invalid; } int n = Integer.valueOf(s); if (n <= 255 && n >= 0) { return true; } return false; } }