# 0093. Restore IP Addresses ###### tags: `Leetcode` `Medium` `FaceBook` `Backtracking` Link: https://leetcode.com/problems/restore-ip-addresses/ ## 思路 O(N) O(N) 原本的想法是用backtracking做,但是有点复杂,有很多情况需要考虑 后来看了别人的解法才发现了这个思路 因为一共有4个数可以填,每个数的长度是1~3,这种有限情况的枚举可以直接用回圈解决,其实和backtracking的核心是一样的 最后检查有没有leading zero是把每个substring转换成数字,再拼接在一起,如果有leading zero在转换成数字的时候就会消失,因此把拼接的string和原来的string长度比较就可以判断有没有leading zero Time Complexity is O(3^4N) because we are running 4 nested loops of size 3, therefore 3^4 and inside the nested loop we are concatenating the string which takes O(N). Therefore total time complexity is O(3^4N)=O(81*N)~O(N). Space complexity is O(N) because we are using string ans to concatenate A, B, C, and D. ## Code ```java= class Solution { List<String> ans; public List<String> restoreIpAddresses(String s) { ans = new ArrayList<>(); StringBuilder sb = new StringBuilder(); for(int a = 1;a <= 3;a++){ for(int b = 1;b <= 3;b++){ for(int c = 1;c <= 3;c++){ int d = s.length()-a-b-c; if(d>3 || d<1) continue; int n1 = Integer.parseInt(s.substring(0, a)); int n2 = Integer.parseInt(s.substring(a, a+b)); int n3 = Integer.parseInt(s.substring(a+b, a+b+c)); int n4 = Integer.parseInt(s.substring(a+b+c)); // System.out.println(n1+" "+n2+" "+n3+" "+n4); if(n1<=255 && n2<=255 && n3<=255 && n4<=255){ sb.append(n1+"."+n2+"."+n3+"."+n4); } if(sb.length() == s.length()+3){ ans.add(sb.toString()); } sb.setLength(0); } } } return ans; } } ```