leetcode902. 最大为 N 的数字组合

class Solution {
public:
    int m;
    int dp(int digit[],int cnt[],int num,int offset,int len){
        if(len==0) return 1;
        int ans=0;
        int cur=(num/offset)%10;
        for(int i=0;i<m;i++){
            int p=digit[i];
            if(p<cur) ans+=cnt[len-1];
            else if(p==cur) ans+=dp(digit,cnt,num,offset/10,len-1);
            else break;
        }
        return ans;
    }
    int atMostNGivenDigitSet(vector<string>& digits, int n) {
        int tmp=n/10;
        int len=1;
        int offset=1;
        while(tmp){
            tmp/=10;
            offset*=10;
            len++;
        }
        m=digits.size();
        int digit[15];
        for(int i=0;i<m;i++){
            digit[i]=digits[i][0]^48;
        }
        int cnt[15];
        cnt[0]=1;
        int ans=0;
        for(int i=1,s=m;i<len;i++,s*=m) cnt[i]=s,ans+=s;
        return ans+dp(digit,cnt,n,offset,len);
    }
};
posted @ 2025-03-16 08:23  九三青梧  阅读(10)  评论(0)    收藏  举报