intcountDigitOne(int n){ s = to_string(n); dp.resize(s.size(), vector<int>(s.size(), -1)); int res = dfs(0, 0, true); return res; }
// nums can have zeroes in between, no need for isNum intdfs(int index, int prev, bool isLimit){ if (index == s.size()) { return prev; } if (!isLimit && dp[index][prev] != -1) { return dp[index][prev]; } int res = 0; int up = isLimit ? s[index] - '0' : 9; for (int i = 0; i <= up; i++) { res += dfs(index + 1, prev + (i == 1), isLimit && i == up); } // check status during read and write memo both if (!isLimit) { dp[index][prev] = res; } return res; } };