Untitled
unknown
plain_text
3 years ago
1.8 kB
11
Indexable
class Solution {
bool notUsed(int i, int bitMask){
return (((1 << i) & bitMask) == 0) ? true : false;
}
int updateMask(int bitMask, int i){
if(i == 0 && bitMask == 0){
return bitMask;
} else {
int newMask = ((1 << i) | bitMask);
return newMask;
}
}
bool findInMap(int index, bool last, int bitMask, unordered_map<int, unordered_map<bool, unordered_map<int, int>>> &mp){
if(
mp.find(index) != mp.end() &&
mp[index].find(last) != mp[index].end() &&
mp[index][last].find(bitMask) != mp[index][last].end()
) return true;
return false;
}
int dp(int index, bool last, int bitMask, string &n, unordered_map<int, unordered_map<bool, unordered_map<int, int>>> &mp){
if(index == n.size()){
return mp[index][last][bitMask] = (bitMask > 1) ? 1 : 0;
}
else if(findInMap(index, last, bitMask, mp))return mp[index][last][bitMask];
else{
int from = 0;
int till = (last ? n[index]-'0': 9);
int countRes = 0;
for(int i = from; i <= till; i++ ){
if(notUsed(i, bitMask)){
int newBitMask = updateMask(bitMask, i);
countRes = countRes + dp(index+1, (last && (i == till)), newBitMask, n, mp);
}
}
return mp[index][last][bitMask] = countRes;
}
}
public:
int numDupDigitsAtMostN(int n) {
string strN = to_string(n);
unordered_map<int, unordered_map<bool, unordered_map<int, int>>> mp;
return n- dp(0, true, 0, strN, mp);
}
};Editor is loading...