forked from AnasImloul/Leetcode-Solutions
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathNumbers With Repeated Digits.cpp
62 lines (42 loc) · 1 KB
/
Numbers With Repeated Digits.cpp
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
50
51
52
53
54
55
56
57
58
59
60
61
62
class Solution {
public:
long long int dp[11][2][2][(1<<10)];
int f(int idx,bool flag,bool repeat,int mask,string &s){
if(idx==s.size()){
return repeat;
}
if(dp[idx][flag][repeat][mask]!=-1) return dp[idx][flag][repeat][mask];
int limit = s[idx]-'0';
if(flag) limit = 9;
int ans=0;
for(int digit=0;digit<=limit;digit++){
if(digit < (s[idx]-'0')){
if(digit==0 and mask==0){
ans+=f(idx+1,true,false,mask,s);
}
else if(mask&(1<<digit)){
ans+=f(idx+1,true,true,mask,s);
}
else{
ans+=f(idx+1,true,repeat,mask | (1<<digit),s);
}
}
else{
if(digit==0 and mask==0){
ans+=f(idx+1,flag,false,mask,s);
}
else if(mask&(1<<digit)){
ans+=f(idx+1,flag,true,mask,s);
}
else{
ans+=f(idx+1,flag,repeat,mask | (1<<digit),s);
}
}
}
return dp[idx][flag][repeat][mask]=ans;
}
int numDupDigitsAtMostN(int n) {
string r = to_string(n);
memset(dp,-1,sizeof dp);
return f(0,false,false,0,r);
}