这个题目就和Palindrome Partitioning很像了,并且比那个的DFS的递归要简单一些,让常人更好理解一些。可是边界条件更多,要考虑清楚。java
总体思路就是深度优先搜索,首先看到边界条件没,若是没有,就深度搜索:web
一开始搜索1个字符和剩下的字符串,判断该字符的index是否越界了,对于剩下的字符串递归;spa
而后是2个字符和剩下的字符串,判断这2个字符的首字符是不是0,对于剩下的字符串递归;rest
而后是3个字符和剩下的字符串,判断这3个字符的首字符是不是0,而且这3个字符组成的数字是否小于等于255,对于剩下的字符串递归。code
ok,思路理清楚了,上代码:orm
import java.util.ArrayList; public class Solution { ArrayList<String> rt = new ArrayList<String>(); ArrayList<Integer> cand = new ArrayList<Integer>(); String str; public ArrayList<String> restoreIpAddresses(String s) { // Start typing your Java solution below // DO NOT write main() function rt.clear(); cand.clear(); str = s; if (s.length() > 12) return rt; dfs(0); return rt; } //index 是当前检测的第一个字符 private void dfs(int index) { //终止条件,已经检测到合法的candidate,那么添加到结果集 if (cand.size() == 4 && index == str.length()) { addCandToRt(); } //由于1位和2位数字确定小于255,因此直接往更深搜索 if (index >= str.length() || cand.size() >= 4) return; cand.add(Integer.parseInt(str.substring(index, index+1))); dfs(index+1); cand.remove(cand.size()-1); if (index >= str.length()-1 || str.substring(index, index+1).equals("0") || cand.size() >= 4) return; cand.add(Integer.parseInt(str.substring(index, index+2))); dfs(index+2); cand.remove(cand.size()-1); if (index >= str.length()-2 || str.substring(index, index+1).equals("0") || cand.size() >= 4) return; if (Integer.parseInt(str.substring(index, index+3)) <= 255) { cand.add(Integer.parseInt(str.substring(index, index+3))); dfs(index+3); cand.remove(cand.size()-1); } } private void addCandToRt() { String ip = cand.get(0) + "." + cand.get(1) + "." + cand.get(2) + "." + cand.get(3); rt.add(ip); } public static void main(String[] args) { String s = "010010"; Solution sl = new Solution(); ArrayList<String> all = sl.restoreIpAddresses(s); for (int i = 0; i < all.size(); i++) { System.out.println(all.get(i)); } } }
我对这个题目的理解是,一个完整的DFS,加上数个条件的剪枝。blog
回头看看有没有别的办法解这道题目。递归