class Solution:
def atMostNGivenDigitSet(self, digits: List[str], n: int) -> int:
n = str(n)[::-1]
dp = [-1] * len(n)
def dfs(cur, limit):
if cur == -1:
return 1
if not limit and dp[cur] != -1:
return dp[cur]
if limit:
up = n[cur]
else:
up = '9'
ans = 0
for i in digits:
if i > up: break
ans = ans + dfs(cur-1, (limit and int(i)) == int(up))
if not limit:
dp[cur] = ans
return ans
def handle(num):
res = 0
for i in range(1, len(num)):
res = res + len(digits) ** i
res = res + dfs(len(num)-1, True)
return res
return handle(n)