Một số Strobogrammatic là số có hình dáng không thay đổi khi xoay 180 độ. Các cặp chữ số hợp lệ: (0,0), (1,1), (8,8), (6,9), (9,6). Nhiệm vụ: tìm tất cả các số Strobogrammatic có độ dài n.
Ví dụ
Đầu vào: n = 2
Đầu ra: ["11","69","88","96"] (Lưu ý: "00" không hợp lệ vì số không dẫn đầu bằng 0).
Thuật toán xây dựng đệ quy
- Khởi tạo danh sách kết quả
ret:- Nếu
nlẻ:ret = {"0", "1", "8"}(các chữ số đối xứng tâm). - Nếu
nchẵn:ret = {""}(chuỗi rỗng làm tâm).
- Nếu
- Lặp cho đến khi độ dài đạt
n(mỗi lần tăng 2):- Với mỗi chuỗi
strongret, xây dựng chuỗi mới bằng cách thêm cặp chữ số ở hai đầu. - Nếu đang xây dựng lớp ngoài cùng (
n > 3), cho phép cặp("0","0"). - Luôn thêm các cặp:
("1","1"),("8","8"),("6","9"),("9","6").
- Với mỗi chuỗi
- Trả về
ret.
Triển khai C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
vector<string> findStrobogrammatic(int n) {
vector<string> ret;
if (n & 1) {
ret = {"0", "1", "8"};
} else {
ret = {""};
}
for (; n > 1; n -= 2) {
vector<string> temp;
for (const string& s : ret) {
if (n > 3) temp.push_back("0" + s + "0");
temp.push_back("1" + s + "1");
temp.push_back("8" + s + "8");
temp.push_back("6" + s + "9");
temp.push_back("9" + s + "6");
}
ret = move(temp);
}
return ret;
}
};
Độ phức tạp
- Thời gian & Không gian: O(5^(n/2)) - số lượng kết quả tăng theo cấp số nhân.
Kết quả kiểm thử
Đầu vào: 3
Đầu ra: [101, 808, 609, 906, 111, 818, 619, 916, 181, 888, 689, 986]