1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| class Solution { private List<Integer> sides; private List<Integer> center;
public List<String> findStrobogrammatic(int n) { if (n == 1) { return new ArrayList<>(Arrays.asList("0", "1", "8")); } sides = new ArrayList<>(Arrays.asList(0, 1, 6, 8, 9, 6, 8, 9, 1, 0)); center = new ArrayList<>(Arrays.asList(0, 1, 8)); List<String> ans = new ArrayList<>(); backtrack(ans, new StringBuilder(), new StringBuilder(), 0, n); return ans; }
private void backtrack(List<String> ans, StringBuilder left, StringBuilder right, int pos, int n) { if (pos == n / 2) { StringBuilder reverse = new StringBuilder(right); reverse.reverse(); if (n % 2 == 0) { ans.add(left.toString() + reverse.toString()); } else { for (int digit : center) { ans.add(left.toString() + digit + reverse.toString()); } } return; } for (int i = 0; i < sides.size() / 2; i++) { if (pos == 0 && i == 0) { continue; } int digit = sides.get(i); int pairDigit = sides.get(sides.size() - 1 - i); left.append(digit); right.append(pairDigit); backtrack(ans, left, right, pos + 1, n); left.setLength(left.length() - 1); right.setLength(right.length() - 1); } } }
|