Given a string containing only digits, restore it by returning all possible valid IP address combinations.
    Example:
    Input: “25525511135”
    Output: ["255.255.11.135", "255.255.111.35"]
    这道题的难点在于:在进一步递归前,准备好当前已经获得的结果,并传入下一步的递归之中
    在递归出来后,恢复当前已经获得的结果,进入下一个递归路径

    1. public class Solution {
    2. public List<String> restoreIpAddresses(String s) {
    3. List<String> res = new ArrayList();
    4. if(s == null || s.length() == 0|| s.length()<4|| s.length()>12){
    5. return res;
    6. }
    7. helper(res,s,new StringBuilder(), 0, 4);
    8. return res;
    9. }
    10. // pos 表示即将考察的字符的位置 初始值是 0
    11. // left表示还需要几部分才能组成一个完整的ip 初始值是 4
    12. private void helper(List<String> res, String s ,StringBuilder sb, int pos, int left){
    13. if(pos == s.length() || left == 0){
    14. // 当字符刚好用完,并且需要的ip的4部分都拼出来时,说明是一个可用的分割,加入结果集中。
    15. if(pos == s.length() && left == 0){
    16. res.add(sb.toString());
    17. }
    18. return;
    19. }
    20. // 在准备添加ip的第2、3、4部分时,先在临时结果中加入一个分隔的 . 号
    21. if(left != 4){
    22. sb.append(".");
    23. }
    24. int len = sb.length();
    25. for(int i = pos + 1 ; i <= Math.min(pos+3,s.length());i++){
    26. // 不考虑 123.04.34.11这种类型的ip, 04 不合法
    27. if(i != pos+1 && s.charAt(pos) =='0'){
    28. break;
    29. }
    30. int num = Integer.parseInt(s.substring(pos,i));
    31. if(num>=0 && num<=255){
    32. sb.append(num);
    33. helper(res,s,sb,i,left-1);
    34. //将存储临时结果的sb进行复原,以便探索其他的路径
    35. sb.setLength(len);
    36. }
    37. }
    38. }
    39. }