【回溯法】复原IP地址

题目描述

给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。

示例:

输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author Joeson Chan
 */
class Solution {
    public static List restoreIpAddresses(String s) {
        if (null == s || s.length() == 0) {
            return new ArrayList();
        }
 
        List list = new ArrayList();
        method(s, list, new ArrayList(), 0, 4);
        return list;
    }
 
    private static void method(String s, List list, List tmp, int index, int count) {
    	if(index == s.length() && tmp.size() == 4){
    		list.add(join(tmp));
    		return;
    	}
        if (count <= 0 || tmp.size() >= 4) {
            return;
        }
 
        for (int i = index; i < index + 3 && i < s.length(); i++) {
            if (isNumValid(s, index, i + 1)) {
                String sub = s.substring(index, i + 1);
                tmp.add(sub);
                method(s, list, tmp, i + 1, count - 1);
                tmp.remove(tmp.size() - 1);
            }
        }
    }
 
    private static String join(List tmp) {
        StringBuilder sb = new StringBuilder();
        			       sb.append(tmp.get(0)).append(".").append(tmp.get(1)).append(".").append(tmp.get(2)).append(".").append(tmp.get(3));
        return sb.toString();
    }
 
    private static boolean isNumValid(String s, int begin, int end) {
        if (begin > end || end - begin > 3) {
            return false;
        }
        if(s.startsWith("0", begin) && end - begin > 1){
            return false;
        }
        
        Integer value = Integer.valueOf(s.substring(begin, end));
        return value >= 0 && value <= 255;
    }
    
}

 

你可能感兴趣的:(算法题)