這個題目就和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
回頭看看有沒有別的辦法解這道題目。遞歸