Problem: 248. 中心对称数 III
方案
困难题,回溯来做的,每次产生指定长度的对称数,检查是否在指定区间内,若是放入集合去重,循环产生不同长度的对称数。最后的集合长度就是结果。
复杂度
时间复杂度:
添加时间复杂度, 示例: O ( n ) O(n) O(n)
空间复杂度:
添加空间复杂度, 示例: O ( n ) O(n) O(n)
Code
class Solution {
public:
vector<char> num{'0', '1', '8', '6', '9'};
unordered_map<char, char> ump{{'0','0'},{'1', '1'},{'8','8'},{'6','9'},{'9','6'}};
set<string> trg;
int result = 0;
long long llow, hhigh, tp;
void recursion(int n, int nn, int ink, string tg) {
if(ink==n) {
if(nn%2==1 && (tg.back()=='6' || tg.back()=='9')) return;
for(int i = nn/2-1; i >= 0; i--) {
tg += ump[tg[i]];
}
tp = stoll(tg);
if(tp >= llow && tp <= hhigh)
trg.insert(tg);
return;
}
for(int i = 0; i < num.size(); i++) {
if(nn != 1 && ink==0 && i==0) continue;
if(nn==1 && ink==0 && i > 2) continue;
recursion(n, nn, ink+1, tg + num[i]);
}
}
void findStrobogrammatic(int n) {
recursion(n/2 + (n%2==0? 0:1), n, 0, "");
}
int strobogrammaticInRange(string low, string high) {
llow = stoll(low);
hhigh = stoll(high);
for(int i = low.length(); i <= high.length(); i++) {
findStrobogrammatic(i);
}
return trg.size();
}
};