Advertisement
1988coder

247. Strobogrammatic Number II

Jan 21st, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.62 KB | None | 0 0
  1.  
  2. // LeetCode URL: https://leetcode.com/problems/strobogrammatic-number-ii/
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. /**
  7.  * Recursive Backtracking using char array
  8.  *
  9.  * Time Complexity : O(5 ^ (N/2))
  10.  *
  11.  * Space Complexity: O(N). There will be maximum N/2 levels in recursion stack.
  12.  *
  13.  * N = input number.
  14.  */
  15. class Solution1 {
  16.     public static final char[][] PAIRS = new char[][] { { '0', '0' }, { '1', '1' }, { '6', '9' }, { '8', '8' },
  17.             { '9', '6' } };
  18.  
  19.     public List<String> findStrobogrammatic(int n) {
  20.         ArrayList<String> result = new ArrayList<>();
  21.         if (n < 0) {
  22.             return result;
  23.         }
  24.  
  25.         dfsHelper(result, new char[n], 0, n - 1);
  26.  
  27.         return result;
  28.     }
  29.  
  30.     private void dfsHelper(ArrayList<String> list, char[] chArr, int left, int right) {
  31.         if (left > right) {
  32.             list.add(new String(chArr));
  33.             return;
  34.         }
  35.  
  36.         for (char[] p : PAIRS) {
  37.             if (chArr.length > 1 && left == 0 && p[0] == '0') {
  38.                 continue;
  39.             }
  40.             if (left == right && p[0] != p[1]) {
  41.                 continue;
  42.             }
  43.             chArr[left] = p[0];
  44.             chArr[right] = p[1];
  45.             dfsHelper(list, chArr, left + 1, right - 1);
  46.         }
  47.     }
  48. }
  49.  
  50. /**
  51.  * Recursive Backtracking Using temp strings
  52.  *
  53.  * Time Complexity : O(5 ^ (N/2))
  54.  *
  55.  * Space Complexity: O(N ^ 2). There will be maximum N/2 levels in recursion
  56.  * stack.
  57.  *
  58.  * N = input number.
  59.  */
  60. class Solution2 {
  61.     public List<String> findStrobogrammatic(int n) {
  62.         ArrayList<String> result = new ArrayList<>();
  63.         if (n < 0) {
  64.             return result;
  65.         }
  66.         if (n % 2 == 0) {
  67.             dfsHelper(result, "", n);
  68.         } else {
  69.             dfsHelper(result, "0", n);
  70.             dfsHelper(result, "1", n);
  71.             dfsHelper(result, "8", n);
  72.         }
  73.  
  74.         return result;
  75.     }
  76.  
  77.     private void dfsHelper(ArrayList<String> list, String tempStr, int n) {
  78.         if (tempStr.length() == n) {
  79.             if (n > 1 && tempStr.charAt(0) == '0') {
  80.                 return;
  81.             }
  82.             list.add(tempStr.toString());
  83.             return;
  84.         }
  85.  
  86.         dfsHelper(list, "0" + tempStr + "0", n);
  87.         dfsHelper(list, "1" + tempStr + "1", n);
  88.         dfsHelper(list, "8" + tempStr + "8", n);
  89.         dfsHelper(list, "6" + tempStr + "9", n);
  90.         dfsHelper(list, "9" + tempStr + "6", n);
  91.     }
  92. }
  93.  
  94. /**
  95.  * Recursive
  96.  *
  97.  * Time Complexity : O(5 ^ (N/2))
  98.  *
  99.  * Space Complexity: O(N * 5 ^ (N/2)). There will be 5 ^ ((N-2)/2) strings of
  100.  * N-2 length at level before result level.
  101.  *
  102.  * N = input number.
  103.  */
  104. class Solution3 {
  105.     public List<String> findStrobogrammatic(int n) {
  106.         if (n < 0) {
  107.             return new ArrayList<>();
  108.         }
  109.  
  110.         return dfsHelper(n, n);
  111.     }
  112.  
  113.     private ArrayList<String> dfsHelper(int m, int n) {
  114.         ArrayList<String> res = new ArrayList<>();
  115.         if (m == 0) {
  116.             res.add("");
  117.             return res;
  118.         }
  119.         if (m == 1) {
  120.             res.add("0");
  121.             res.add("1");
  122.             res.add("8");
  123.             return res;
  124.         }
  125.  
  126.         ArrayList<String> list = dfsHelper(m - 2, n);
  127.  
  128.         for (String s : list) {
  129.             if (m != n) {
  130.                 res.add("0" + s + "0");
  131.             }
  132.             res.add("1" + s + "1");
  133.             res.add("8" + s + "8");
  134.             res.add("6" + s + "9");
  135.             res.add("9" + s + "6");
  136.         }
  137.         return res;
  138.     }
  139. }
  140.  
  141. /**
  142.  * Iterative
  143.  *
  144.  * Time Complexity : O(5 ^ (N/2))
  145.  *
  146.  * Space Complexity: O(N * 5 ^ (N/2)). There will be 5 ^ ((N-2)/2) strings of
  147.  * N-2 length at level before result level.
  148.  *
  149.  * N = input number.
  150.  */
  151. class Solution4 {
  152.     public List<String> findStrobogrammatic(int n) {
  153.         ArrayList<String> result = new ArrayList<>();
  154.         if (n < 0) {
  155.             return result;
  156.         }
  157.         if (n % 2 == 0) {
  158.             result.add("");
  159.         } else {
  160.             result.add("0");
  161.             result.add("1");
  162.             result.add("8");
  163.         }
  164.         ArrayList<String> list;
  165.         for (int i = n; i > 1; i -= 2) {
  166.             list = result;
  167.             result = new ArrayList<>();
  168.             for (String s : list) {
  169.                 if (i > 3) {
  170.                     result.add("0" + s + "0");
  171.                 }
  172.                 result.add("1" + s + "1");
  173.                 result.add("8" + s + "8");
  174.                 result.add("6" + s + "9");
  175.                 result.add("9" + s + "6");
  176.             }
  177.         }
  178.         return result;
  179.     }
  180. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement