题目:
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地址的点被消除了,根据剩下的数字字符串恢复出可能的ip地址。对于一个ip地址,分为四段,每段最多为三位,最少为一位,每段都在0-255之间.用一个整数start记录当前的段数,当第三段完之后,只需要判断第四段是否合法即可。判断字符串是否合法,如果第一个字符为'0',需要判断是否全为0;如果第一个字符不为'0',判断是否在0-255之间。
代码:
class Solution { //对于一个ip地址,分为四段,每段最多为三位,最少为一位,每段都在0-255之间.用一个整数start记录当前的段数,当第三段完之后,只需要判断第四段是否合法即可 public List<String> restoreIpAddresses(String s) { List<String> list = new ArrayList<>(); if(s.length()<4 || s.length() >12) return list; dfs(s,0,"",list); return list; } private void dfs(String s,int start,String res,List<String> list){ if(start >3) return; if(start == 3 && isValid(s)){ list.add(res + s); return; } for(int i=0;i<3 && i<s.length();i++){ //这里记得还要判断不能超出字符串范围 String sub = s.substring(0,i+1); if(isValid(sub)) dfs(s.substring(i+1,s.length()),start+1,res + sub + ".",list); } } private boolean isValid(String s){ //判断字符串是否合法,如果第一个字符为'0',需要判断是否全为0;如果第一个字符不为'0',判断是否在0-255之间 if(s.length()==0) return false; if(s.charAt(0)=='0') return s.equals("0"); if(Integer.parseInt(s)<=255 && Integer.parseInt(s)>0) return true; else return false; } }