// 解题 ref http://bangbingsyb.blogspot.com/2014/11/leetcode-restore-ip-addresses.html
引用原文
一个有效的IP地址由4个数字组成,每个数字在0-255之间。对于其中的2位数或3位数,不能以0开头。所以对于以s[i]开头的数字有3种可能:
1. s[i]
2. s[i : i+1],s[i] !=0时
3. s[i : i+2],s[i] != 0,且s[i : i+2] <= 255
根据以上规律,对s从头开始进行DFS寻找4个数字即可
代码参考 http://blog.csdn.net/linhuanmars/article/details/24683699
public class Solution {
public ArrayList<String> restoreIpAddresses(String s) {
ArrayList<String> res = new ArrayList<String>();
if(s==null || s.length()==0) return res;
dfs(0,1,res,"",s);
return res;
}
public void dfs(int ind, int segment, ArrayList<String> res, String item, String s){
if(ind>=s.length()) return;
if(segment == 4){
String str = s.substring(ind);
if(isValid(str)){
res.add(item+"."+str);
}
return;
}
//for(int i=ind; i<s.length()&& segment<4; i++){ wrong
for(int i=1; segment<4 && (i+ind <= s.length()); i++){
String str = s.substring(ind, ind+i);
if(isValid(str)){
if(segment==1){
dfs(ind+i, segment+1, res, str, s);
}else{
dfs(ind+i, segment+1, res, item+"."+str, s);
}
}
}
}
public boolean isValid(String str){
if(str==null|| str.length()>3) return false;
int num= Integer.parseInt(str);
//if(num==0 && str.length()>1) return false;
if(str.charAt(0)=='0' && str.length()>1) return false;
if(num>=0 && num<=255) return true;
return false;
}
}