
链接:. - 力扣(LeetCode)
题解:. - 力扣(LeetCode)
int countSpecialNumbers(int n) {
std::string str = to_string(n);
std::vectorint>> memo(str.size(), std::vector<int>(1 << 10, -1));
return dfs(str, begin, is_limit, is_num, mask, memo);
int dfs(std::string& n, int begin, bool is_limit, bool is_num, int mask,
std::vectorint>>& memo) {
if (!is_limit && is_num && memo[begin][mask] != -1) {
return memo[begin][mask];
result += dfs(n, begin+1, false, false, mask, memo);
int up = is_limit ? n[begin] - '0' : 9;
for (int i = 1 - is_num; i <= up; ++i) {
result += dfs(n, begin+1, is_limit && (i == up ? true : false),
true, mask | (1 << i), memo);
if (!is_limit && is_num) {
memo[begin][mask] = result;