leetcode 247

问题

A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at upside down).

Find all strobogrammatic numbers that are of length = n.

Example:

1
2
Input:  n = 2
Output: ["11","69","88","96"]

分析

思路1:先考虑n位数的前n/2位,然后在通过前n/2位生成后n/2。注意corner case,n为奇数的情况下这n位数的最中间的一位只能取到’0’, ‘1’, ‘8’三种情况,以及在考虑前n/2时,第一位应该从’1’开始取,其他位从’0’开始取。

思路2:采用确定中间进行两边扩展的方式,递归地进行处理。注意corner case,n为奇数和n为偶数,以及要不要首位添加’0’的判断。

代码1

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
43
44
45
46
47
48
49
class Solution {
public:
char a[5] = {'0', '1', '6', '8', '9'};
vector<string> findStrobogrammatic(int n) {
vector<string> ans;
int suffixNum = n/2;
bool odd = (n%2)==1? true: false;
string s;
dfs(ans, s, suffixNum, odd);
return ans;
}

void dfs(vector<string> &ans, string &s, int suffixNum, bool odd) {
if (s.size() == suffixNum) {
string rs = getMirror(s);
if (odd) {
ans.push_back(s + "0" + rs);
ans.push_back(s + "1" + rs);
ans.push_back(s + "8" + rs);
} else {
ans.push_back(s+rs);
}
} else {
int startIndex = s.size() == 0? 1: 0;
for (int i = startIndex; i < 5; ++i) {
s += a[i];
dfs(ans, s, suffixNum, odd);
s.pop_back();
}
}
}

string getMirror(const string &s) {
string ret;
for (int i = s.size()-1; i>=0; --i) {
char c;
switch (s[i]) {
case '0': c = '0'; break;
case '1': c = '1'; break;
case '6': c = '9'; break;
case '8': c = '8'; break;
case '9': c = '6'; break;
default: break;
}
ret += c;
}
return ret;
}
};

代码2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public:
vector<string> findStrobogrammatic(int n) {
return helper(n, n);
}
vector<string> helper(int n, int m) {
if (n == 0) return {""};
if (n == 1) return {"0", "1", "8"};

vector<string> number = helper(n-2, m);
vector<string> ret;
for (string &s: number) {
if (n != m)
ret.push_back('0' + s + '0');
ret.push_back('1'+s+'1');
ret.push_back('6'+s+'9');
ret.push_back('8'+s+'8');
ret.push_back('9'+s+'6');
}
return ret;
}
};