回溯法插入'.',每次可以插入到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个字符之后 } }