2801. Count Stepping Numbers in Range
Given two positive integers low and high represented as strings, find the count of stepping numbers in the inclusive range [low, high].
A stepping number is an integer such that all of its adjacent digits have an absolute difference of exactly 1.
Return an integer denoting the count of stepping numbers in the inclusive range [low, high].
Since the answer may be very large, return it modulo 109 + 7.
Note: A stepping number should not have a leading zero.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| class Solution { long long dp[111][10], sum[111], mod = 1e9 + 7; bool stepping(string& s) { for(int i = 1; i < s.length(); i++) { if(abs(s[i] - s[i-1]) == 1) continue; return false; } return true; } long long helper(string& s, long long pos) { if(pos + 1 >= s.length()) return 1; long long res = 0, a = s[pos] - '0', b = s[pos+1] - '0'; if(a - 1 == b) return helper(s,pos+1); if(a - 1 < b and a > 0) res = (res + dp[s.length() - pos - 2][a - 1]) % mod; if(a + 1 == b) return (res + helper(s,pos+1)) % mod; if(a + 1 < b) res = (res + dp[s.length() - pos - 2][a + 1]) % mod; return res; } long long helper(string& s) { if(s.length() == 1) return s[0] - '0'; long long res = sum[s.length() - 2]; for(int i = 1; i < s[0] - '0'; i++) res = (res + dp[s.length() - 1][i]) % mod; return (res + helper(s,0)) % mod; } public: int countSteppingNumbers(string low, string high) { memset(dp, 0, sizeof dp); memset(sum,0,sizeof sum); for(int i = 0; i <= 9; i++) dp[0][i] = 1; sum[0] = 9; for(int i = 1; i < 111; i++) { sum[i] = sum[i-1]; for(int j = 0; j <= 9; j++) { if(0 <= j - 1 and j - 1 <= 9) dp[i][j] += dp[i - 1][j - 1]; if(0 <= j + 1 and j + 1 <= 9) dp[i][j] += dp[i - 1][j + 1]; dp[i][j] %= mod; if(j) sum[i] = (sum[i] + dp[i][j]) % mod; } } return (helper(high) - helper(low) + stepping(low) + mod) % mod; } };
|