题目描述
现在有一个只包含数字的字符串,将该字符串转化成IP地址的形式,返回所有可能的情况。
例如:
给出的字符串为"25525511135",
返回["255.255.11.135", "255.255.111.35"]. (顺序没有关系)
解:
这道题采用的是回溯,我们递归查找,获得结果后返回进行下一个分支查找。
子结构:插入“ . ”,如果还未满足3个点。
判断是否为IP地址:是否“ .*. ”的 * 满足<255(这里不需要考虑>0,因为字符串不带-),同时不能存在“ 0* ”形式。
import java.util.*;
public class Solution {
/**
*
* @param s string字符串
* @return string字符串ArrayList
*/
public void dfs(String s, int i, int num, ArrayList<String> al){
//判断插入完成的是否满足
if(num==0){
String[] ss=s.split("\\.");
for(String cs : ss){
//每个数字是否有0开头或>255
if(Integer.parseInt(cs)>255){
return;
}
if(cs.length()>1 && cs.charAt(0)=='0'){
return;
}
}
al.add(s);
return;
}
//插入未完成,分._ .__ .___ 三种情况
if((i+2)<s.length()){
//注意substring()函数左闭右开
dfs(s.substring(0,i+2)+"."+s.substring(i+2,s.length()),i+2,num-1,al);
}
if((i+3)<s.length()){
dfs(s.substring(0,i+3)+"."+s.substring(i+3,s.length()),i+3,num-1,al);
}
if((i+4)<s.length()){
dfs(s.substring(0,i+4)+"."+s.substring(i+4,s.length()),i+4,num-1,al);
}
return;
}
public ArrayList<String> restoreIpAddresses (String s) {
ArrayList<String> al=new ArrayList<String>();
dfs(s,-1,3,al);
return al;
}
}