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)
ip 规则和题解抄自“爱做饭”:) ref http://www.cnblogs.com/springfor/p/3886409.html
“
利用循环递归解决子问题。对于每个段内数来说,最多3位最少1位,所以在每一层可以循环3次,来尝试填段。因为IP地址最多4个分段,当层数是3的时候说明已经尝试填过3个段了,那么把剩余没填的数段接到结尾即可。
这个过程中要保证的是填的数是合法的,最后拼接的剩余的数也是合法的。
注意开头如果是0的话要特殊处理,如果开头是0,判断整个串是不是0,不是的话该字符就是非法的。因为001,01都是不对的。
”
public class Solution { public ArrayList<String> restoreIpAddresses(String s) { ArrayList<String> res = new ArrayList<String>(); if(s==null||s.length()<4||s.length()>12) return res; dfs(0,1,res,s,""); return res; } private void dfs(int start, int segment, ArrayList<String> res, String s, String item){ if(start>=s.length()) return; if(segment==4){ String str = s.substring(start); if(isValid(str)){ res.add(item + "." + str); } return; } for(int i=1; segment<4 && (i+start)<=s.length();i++){ String str = s.substring(start, start+i); if(isValid(str)){ if(segment ==1){ dfs(start+i, segment+1,res, s, str); }else{ dfs(start+i, segment+1,res, s, item+"."+str); } } } } private boolean isValid(String str){ if(str==null||str.length()>3||(str.charAt(0)=='0'&&str.length()>1)) return false; int code = Integer.parseInt(str); return (code>=0 && code<=255); } }