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);
}
}
}

backtrack, 我们需要知道一个digit和他配对的digit是谁. 同时两端不能为0.

时间复杂度: O(N * 5^([N/2] + 1)) 因为每种情况我们都需要O(n), 一共是5的二分之n再减去1次方.
空间复杂度: O(N * 5^[N/2]) stack是O(N/2) = O(N), 存答案的list需要O(N * 5^[N/2]).