[leetcode] Restore IP Addresses

這個題目就和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

回頭看看有沒有別的辦法解這道題目。遞歸

相關文章
相關標籤/搜索