LeetCode 902. 最大为 N 的数字组合
暴力递归
class Solution {
public:
string s;
int dfs(vector<string> digits, int u, bool limit, bool first)
{
if(u == s.size()) return first == false;
int res = 0;
if(first)
res += dfs(digits, u + 1, false, true);
char up = limit ? s[u] : '9';
for(auto& d : digits)
{
if(d[0] > up) break;
res += dfs(digits, u + 1, limit && up == d[0], false);
}
return res;
}
int atMostNGivenDigitSet(vector<string>& digits, int n) {
s = to_string(n);
return dfs(digits, 0, true, true);
}
};
数位DP
const int N = 12;
class Solution {
public:
string s;
int f[N];
//limit 是否受上一位限制 first:是否为第一位
int dfs(vector<string> digits, int u, bool limit, bool first)
{
if(u == s.size()) return first == false;
if(!limit && !first && f[u] >= 0) return f[u];
int res = 0;
if(first)
res += dfs(digits, u + 1, false, true);
char up = limit ? s[u] : '9';
for(auto& d : digits)
{
if(d[0] > up) continue;
res += dfs(digits, u + 1, limit && up == d[0], false);
}
if(!limit && !first) f[u] = res;
return res;
}
int atMostNGivenDigitSet(vector<string>& digits, int n) {
memset(f, -1, sizeof f);
s = to_string(n);
return dfs(digits, 0, true, true);
}
};