import java.util.*; /** * 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) * * Tags: Backtracking, String */ class RestoreIPAddr { public static void main(String[] args) { restoreIPAddresses("25525511135"); restoreIPAddresses("010010"); } /** * Figure out what is a valid IP address * Use backtracking to insert dots into string */ public static List<String> restoreIPAddresses(String s) { List<String> res = new ArrayList<String>(); if (s.length() < 4 && s.length() > 12) return res; backtrack(s, 3, res, ""); return res; } /** * @param s current string for this backtrack * @param dot how many dots left, when equals 0, add last value to result * @param res result list of strings * @param ip current ip for this backtrack */ public static void backtrack(String s, int dot, List<String> res, String ip) { if (dot == 0) { if (isValid(s)) { ip += s; res.add(ip); } return; } for (int i = 1; i < 4 && i < s.length(); i++) { String pre = s.substring(0, i); if (isValid(pre)) backtrack(s.substring(i), dot - 1, res, ip + pre + "."); } } /** * A valid IP address, each block should be from 0 to 255 * Should not be 0X or 0XX */ static boolean isValid(String s) { if (s.startsWith("0") && s.length() > 1 || Integer.valueOf(s) > 255) return false; return true; } }