[leedcode 93] 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 Solution { List<String> res; StringBuilder seq; public List<String> restoreIpAddresses(String s) { /* 采用递归的解法。基本思路就是取出一个合法的数字,作为IP地址的一项,然后递归处理剩下的项。 可以想象出一颗树,每个结点有三个可能的分支(因为范围是0-255,所以可以由一位两位或者三位组成)。 并且这里树的层数不会超过四层,因为IP地址由四段组成,到了之后我们就没必要再递归下去,可以结束了。 递归结束的条件是遍历完4段,字符串也恰好读完了。可以看出这棵树的规模是固定的, 时间复杂度取决于输入的规模,是指数量级的,所以这道题并不是NP问题,因为他的分支是四段,有限制。*/ res=new ArrayList<String>(); seq=new StringBuilder(); getIpAddress(s,0,1);//index segment return res; } public void getIpAddress(String s,int index,int seg){ if(seg>4){//递归截止的条件,大于4段,并且不存在多余的字符 if(index==s.length()){ res.add(new String(seq)); } return; } for(int i=1;i<4&&(index+i)<=s.length();i++){//DFS,注意要删除seq的值 String temp=s.substring(index,index+i); if(isvalid(temp)){ if(seg==1){ seq.append(temp); }else{ seq.append("."+temp); } getIpAddress(s,index+i,seg+1); int t=seg==1?0:1; seq.delete(seq.length()-i-t,seq.length()); } } } public boolean isvalid(String s){//验证每一段是否满足要求,不能是“01”,不能大于三位,范围在0 到255 if(s==null||s.length()>3) return false; if(s.length()>1&&s.charAt(0)=='0') return false; int temp=Integer.parseInt(s);///// if(temp>=0&&temp<=255) return true; return false; } }