【Lintcode】426. Restore IP Addresses

題目地址:

https://www.lintcode.com/problem/restore-ip-addresses/description

給定一個由數字組成的字符串,返回其加上小數點組成的所有合法的IP地址。合法的IP地址由四個02550\sim 255的數字組成。

思路是DFS。嘗試切出一個子串,如果符合條件就加到StringBuilder末尾,然後進入下一層遞歸。注意幾個可以剪枝的情況:只需枚舉切出長度爲33或更短的數字即可,此外如果發現剩餘的長度大於33乘以剩餘要切出數字個數,那也不用切了,因爲繼續切下去會切不到末尾。代碼如下:

import java.util.ArrayList;
import java.util.List;

public class Solution {
    /**
     * @param s: the IP string
     * @return: All possible valid IP addresses
     */
    public List<String> restoreIpAddresses(String s) {
        List<String> res = new ArrayList<>();
    
        dfs(s, 0, new StringBuilder(), 0, res);
    
        return res;
    }
    
    private void dfs(String s, int pos, StringBuilder sb, int cut, List<String> res) {
        if (pos == s.length()) {
        	// 如果到達了末尾且切出了4個數,則加入最終結果。但要把結尾的小數點去掉
            if (cut == 4) {
                res.add(sb.substring(0, sb.length() - 1));
            }
            return;
        }
        
        for (int i = Math.min(s.length(), pos + 3); i >= pos + 1; i--) {
            if (s.length() - i > (4 - cut) * 3) {
                return;
            }
            
            String cur = s.substring(pos, i);
            if ((!cur.startsWith("0") || cur.equals("0")) && Integer.parseInt(cur) <= 255 && cut < 4) {
                sb.append(cur).append('.');
                dfs(s, i, sb, cut + 1, res);
                sb.setLength(sb.length() - cur.length() - 1);
            }
        }
    }
}

時間複雜度O(n2n2)O(n2^{\frac{n}{2}}),空間複雜度O(n)O(n)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章