6
public int solve(String num, int pos, boolean bound, Integer[] dig, boolean lead) {8
if (pos == num.length()) {14
if (digitdp[pos][(bound == true) ? 1 : 0][(lead == true) ? 1 : 0] != null)15
return digitdp[pos][(bound == true) ? 1 : 0][(lead == true) ? 1 : 0];18
maxDigit = num.charAt(pos) - '0';24
for (int i = 0; i <= maxDigit; i++) {26
// 0 can only be leading29
ans += solve(num, pos + 1, false, dig, lead);33
int res = Arrays.binarySearch(dig, i);36
// lead = false; // now it is not possible to 0 to be in lead any more once any other call38
ans += solve(num, pos + 1, bound & (i == num.charAt(pos) - '0'), dig, false);43
return digitdp[pos][(bound == true) ? 1 : 0][(lead == true) ? 1 : 0] = ans;46
public int atMostNGivenDigitSet(String[] digits, int n) {49
Integer[] dig = new Integer[digits.length];50
for (int i = 0; i < dig.length; i++) {51
dig[i] = Integer.parseInt(digits[i]);54
digitdp = new Integer[20][2][2];55
return solve(num, 0, true, dig, true) - 1;