DFS算法的练习,现在逐渐对这类题有感觉了!
在parseInt时用到的一个小技巧是:
int val = Integer.parseInt(s); if(!String.valueOf(val).equals(s)){ // 防止解析成00.01.010.0类似的情况 return false; }
package Level3; import java.util.ArrayList; /** * * Restore IP Addresses * * * 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) * */ public class S93 { public static void main(String[] args) { System.out.println(restoreIpAddresses("25525511135")); } public static ArrayList<String> restoreIpAddresses(String s) { ArrayList<String> al = new ArrayList<String>(); if(s.length() > 12){ // 及时过滤 return al; } StringBuilder sb = new StringBuilder(); dfs(s, al, sb, 0); return al; } public static boolean isValid(String s){ if(s.length()==0 || s.length()>3){ return false; } int val = Integer.parseInt(s); if(!String.valueOf(val).equals(s)){ // 防止解析成00.01.010.0类似的情况 return false; } if(val<0 || val>255){ return false; } return true; } public static void dfs(String s, ArrayList<String> al, StringBuilder sb, int level){ if(level == 3){ // 第3次特别判断,必须取剩下的全部字符串 if(isValid(s)){ sb.append(s); al.add(sb.toString()); // 最后一次不加. sb.delete(sb.length()-s.length(), sb.length()); // 撤销动作 return; } } for(int i=0; i<s.length()-1; i++){ String substr = s.substring(0, i+1); if(isValid(substr)){ sb.append(substr).append("."); // 执行动作 dfs(s.substring(i+1), al, sb, level+1); sb.delete(sb.length()-1-substr.length(), sb.length()); // 撤销动作 } } } }
更加清晰的思路:
public class Solution { public List<String> restoreIpAddresses(String s) { List<String> ret = new ArrayList<String>(); List<String> list = new ArrayList<String>(); rec(ret, list, s); return ret; } public void rec(List<String> ret, List<String> list, String s) { if(list.size() > 4) { // not possible return; } if(list.size() == 4 && s.length() == 0) { String concat = ""; for(int i=0; i<list.size(); i++) { concat += list.get(i); if(i != list.size()-1) { concat += "."; } } ret.add(concat); return; } for(int i=1; i<=3; i++) { if(i > s.length()) { continue; } String substr = s.substring(0, i); if(Integer.parseInt(substr) > 255) { // ignore >255 continue; } if(substr.length() > 1 && substr.charAt(0) == '0') { // ignore sth like "01" continue; } list.add(substr); rec(ret, list, s.substring(i)); list.remove(list.size()-1); } } }