1012. 至少有 1 位重复的数字
这题在我能力范围以外,解释起来也有点复杂,具体看灵神题解吧,我就翻写了一下灵神的代码。之后有时间了会总结数位dp的题型。
class Solution {
public:
int numDupDigitsAtMostN(int n) {
string s=to_string(n);
int len=s.length();
vector<vector<int>> dp(len,vector<int> (1<<10,-1));
function<int(int,int,bool,bool)> fun=[&] (int i,int mask,bool isLimit,bool isNum)->int{
if(i==len) return isNum;
if(!isLimit&&isNum&&dp[i][mask]!=-1) return dp[i][mask];
int res=0;
if(!isNum) res=fun(i+1,mask,false,false);
int up=isLimit?s[i]-'0':9;
for(int d=1-isNum;d<=up;d++){
if((mask>>d&1)==0) res+=fun(i+1,mask|(1<<d),isLimit&&d==up,true);
}
if(!isLimit&&isNum) dp[i][mask]=res;
return res;
};
return n-fun(0,0,true,false);
}
};