1. 程式人生 > >93. Restore IP Addresses (DFS, String)

93. Restore IP Addresses (DFS, String)

Given a string containing only digits, restore it by returning all possible valid IP address combinations.

Example:

Input: "25525511135"
Output: ["255.255.11.135", "255.255.111.35"]

思路:

合法性的規則:

IP 地址的規律是分4個Part,每個Part是從0-255的數字

0-255的數字,轉換成字元,即每個Part 可能由一個字元組成,二個字元組成,或者是三個字元組成。

寫一個For迴圈每一層從1個字元開始取一直到3個字元,再加一個isValid的函式來驗證取的字元是否是合法數字,如果是合法的數字,我們再進行下一層遞迴,否則跳過。

注意:

1. isValid函式邊界:有0開頭的字串只有“0”合法

2. 迴圈判定條件還包括長度

3. 每次判定合法性之後加上substr和“.”

4. 最後只有用完所有字元並且有四個部分才是爭取的ip。此時直接驗證剩下字元的合法性即可(合法性就保證位數不大於3)

public List<String> restoreIpAddresses(String s) {
        List<String> res = new ArrayList<String>();
        if(s.length()==0 || s.equals("") ||s.length()>12)
            return res;
        dfs(s,0,"",res);
        return res;
    }
    
    private void dfs(String s,int part, String tmp,List<String> res){
        if(part==3 && isValid(s)){
            res.add(tmp+s);
            return;
        }
        for(int i=1;i<4 && i<s.length();i++){//注意迴圈條件除了四段上線之外還要不能大於s的長度
            String sub = s.substring(0, i);
            if(!isValid(sub))
                continue;
            dfs(s.substring(i),part+1,tmp+sub+".",res);//直接截斷s
        }
    }
    private boolean isValid(String s){
        if(s.charAt(0)=='0')
            return s.equals("0");//"010","001"這種都不合法
        int value = Integer.valueOf(s);
        if(value>=0 && value<=255)
            return true;
        else 
            return false;
    }