[leetcode] Restore IP Addresses

这个题目就和Palindrome Partitioning很像了,而且比那个的DFS的递归要简单一些,让常人更好理解一些。但是边界条件更多,要考虑清楚。

整体思路就是深度优先搜索,首先看到边界条件没,如果没有,就深度搜索:

一开始搜索1个字符和剩下的字符串,判断该字符的index是否越界了,对于剩下的字符串递归;

然后是2个字符和剩下的字符串,判断这2个字符的首字符是否是0,对于剩下的字符串递归;

然后是3个字符和剩下的字符串,判断这3个字符的首字符是否是0,并且这3个字符组成的数字是否小于等于255,对于剩下的字符串递归。

ok,思路理清楚了,上代码:

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,加上数个条件的剪枝。

回头看看有没有别的办法解这道题目。

posted on 2013-07-10 19:14  kkmm  阅读(2974)  评论(0编辑  收藏  举报