LeetCode - Restore IP Addresses | Darren's Blog



Given a string containing only digits, restore it by returning all possible valid IP address combinations.
For example: given "25525511135", return ["255.255.11.135", "255.255.111.35"]. (Order does not matter)
Note: according to the feedback from the test cases, any part that is in the form of '0x' or '0xx' is not valid.
Recursion: Using DFS from http://blog.csdn.net/u011095253/article/details/9158449
0-255的数字,转换成字符,即每个Part 可能由一个字符组成,二个字符组成,或者是三个字符组成。那这又成为组合问题了,dfs便呼之欲出
所以我们写一个For循环每一层从1个字符开始取一直到3个字符,再加一个isValid的函数来验证取的字符是否是合法数字,如果是合法的数字,我们再进行下一层递归,否则跳过。
public ArrayList<String> restoreIpAddresses(String s) {
        ArrayList<String> res = new ArrayList<String>();
        if (s.length()<4||s.length()>12) return res;
        dfs(s,"",res,0);
        return res;
    }
   
    public void dfs(String s, String tmp, ArrayList<String> res, int count){
        if (count == 3 && isValid(s)) {
            res.add(tmp + s);
            return;
        }
        for(int i=1; i<4 && i<s.length(); i++){
            String substr = s.substring(0,i);
            if (isValid(substr)){
                dfs(s.substring(i), tmp + substr + '.', res, count+1);
            }
        }
Iterative Version: code from http://www.darrensunny.me/leetcode-restore-ip-addresses/
Alternatively, we can consider each part iteratively by explicitly determining the positions of the dots.
public ArrayList<String> restoreIpAddresses(String s) {
        ArrayList<String> result = new ArrayList<String>();
        if (s == null)
            return result;
        int n = s.length();
        if (n < 4 || n > 12)
            return result;
 
        // For each possible first part
        for (int i = 1; i <= 3; i++) {      // At most three digits at each part
            if (n-i > 9)    // The number of digits for remaining three parts should not exceed 9
                continue;
            if (s.charAt(0) == '0' && i > 1)    // 0x or 0xx is not allowed
                break;
            String first = s.substring(0, i);   // String before the first dot
            if (Integer.parseInt(first) <= 255) {   // The first part is within proper range
                // For each possible second part given the first part
                for (int j = i+1; j <= i+3 && j < n; j++) {
                    if (n-j > 6)    // The number of digits for remaining two parts should not exceed 6
                        continue;
                    if (s.charAt(i) == '0' && j > i+1)
                        break;
                    String second = s.substring(i, j);  // String after the first dot and before the second
                    if (Integer.parseInt(second) <= 255) {  // The second part is within proper range
                        // For each possible third part given the second part
                        for (int k = j+1; k <= j+3 && k < n; k++) {
                            if (n-k > 3)    // The number of digits for remaining part should not exceed 3
                                continue;
                            if (s.charAt(j) == '0' && k > j+1)
                                break;
                            String third = s.substring(j, k);   // String after the second dot and before the third
                            if (Integer.parseInt(third) <= 255) {   // The third part is within proper range
                                // If the fourth part is a single digit, or it does not begin with a '0' and
                                // it is within proper range, we have got a valid IP address
                                if (k == n-1 || s.charAt(k) != '0' && Integer.parseInt(s.substring(k)) <= 255)
                                    result.add(first+'.'+second+'.'+third+'.'+s.substring(k));
                            }
                        }
                    }
                }
            }
        }
 
        return result;
    }
Also refer to http://yucoding.blogspot.com/2013/04/leetcode-question-83-restore-ip.html
Read full article from LeetCode - Restore IP Addresses | Darren's Blog

No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts