题目描述
现在有一个只包含数字的字符串,将该字符串转化成IP地址的形式,返回所有可能的情况。
例如:
给出的字符串为"25525522135",
返回[“255.255.22.135”, “255.255.221.35”]. (顺序没有关系)
分析
回溯法插入’.’,每次可以插入到1个,2个或者3个字符后面,插入3次之后对得到的字符串进行验证
代码
import java.util.*;
public class Solution {
/**
*
* @param s string字符串
* @return string字符串ArrayList
*/
public ArrayList<String> restoreIpAddresses (String s) {
// write code here
ArrayList<String> list=new ArrayList<>();
if(s.length()==0)return list;
backTrack(s,0,3,list);
return list;
}
//i:本次插入的起始位置 cnt:剩余可插入'.'的次数
public void backTrack(String s,int i,int cnt,ArrayList<String> list){
if(cnt==0){
String[] strs=s.split("\\."); //'.'要转义
if(strs.length<4)return ; //保证插入得到4个子串,不会出现多个'.'相连的情况
for(String str:strs){
if(str.length()>1&&str.charAt(0)=='0')return ; //排除有前导0的情况
if(Integer.parseInt(str)<0||Integer.parseInt(str)>255)return ; //排除不在范围的情况
}
list.add(s);
return ;
}
if(i>=s.length())return ; //没插完就结束的情况
int n=s.length();
backTrack(s.substring(0,i+1)+"."+s.substring(i+1,n),i+2,cnt-1,list); //插入到1个字符之后
if(i+2<n)backTrack(s.substring(0,i+2)+"."+s.substring(i+2,n),i+3,cnt-1,list); //插入到2个字符之后
if(i+3<n)backTrack(s.substring(0,i+3)+"."+s.substring(i+3,n),i+4,cnt-1,list); //插入到3个字符之后
}
}