classSolution{public List<String>restoreIpAddresses(String s){
List<String> res =newArrayList<>();int len = s.length();if(len <4|| len >12)return res;
Deque<String> path =newArrayDeque<>(4);dfs(s, len,4,0, path, res);return res;}publicvoiddfs(String s,int len,int rest,int start, Deque<String> path, List<String> res){//回溯算法的步骤//1.回溯结束的条件和将路径加入到结果集中if(start == len && rest ==0){
res.add(String.join(".", path));return;}//2.在选择列表中做出选择for(int i = start; i < start +3; i++){//这里i表示要截取的位置,从start开始,长度最多为3if(len <= i)break;//截取的位置超出了字符串的长度,直接结束循环//if(rest * 3 < len - i) continue; //还需要截取的IP字段的最大总长度rest*3,小于实际所剩的IP字段的长度,直接进入下一轮循环,直到最大总长度大于等于所剩长度if((rest -1)*3< len - i -1)continue;//判断除去当前的IP字段后,还剩下要截取rest-1个字段,再与之剩下的字符进行长度比较if(IpLegel(s, start, i)){//3.做选择
path.addLast(s.substring(start, i +1));dfs(s, len, rest -1, i +1, path, res);//4.撤销选择
path.removeLast();}}}publicbooleanIpLegel(String s,int left,int right){int len = right - left +1;if(len >1&& s.charAt(left)=='0')returnfalse;int res =0;for(int i = left; i <= right; i++){
res = res *10+ s.charAt(i)-'0';}return res >=0&& res <=255;}}
96.不同的二叉搜索树(动态规划)
假设 n 个节点存在二叉排序树的个数是 G (n),令 f(i) 为以 i 为根的二叉搜索树的个数,则 G(n) = f(1) + f(2) + f(3) + f(4) + … + f(n)
当 i 为根节点时,其左子树节点个数为 i-1 个,右子树节点为 n-i,则 f(i) = G(i-1)*G(n-i)