Giả sử chúng ta có một chuỗi s. Chữ s chứa các chữ số từ 0 - 9 và chúng ta cũng có một số k khác. Chúng ta phải tìm số cách khác nhau mà s có thể được biểu diễn dưới dạng danh sách các số từ [1, k]. Nếu câu trả lời là rất lớn thì trả về kết quả mod 10 ^ 9 + 7.
Vì vậy, nếu đầu vào là s ="3456" k =500, thì đầu ra sẽ là 7, vì chúng ta có thể biểu diễn các s như [3, 4, 5, 6], [34, 5, 6], [3, 4, 56], [3, 45, 6], [34, 56], [345, 6], [3, 456]
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
m:=10 ^ 9 + 7
-
N:=kích thước của s
-
dp:=danh sách kích thước (N + 1) và điền bằng 0
-
dp [N]:=1
-
đối với tôi trong phạm vi N - 1 đến 0, giảm 1, thực hiện
-
curr_val:=0
-
đối với j trong phạm vi từ i đến N, thực hiện
-
curr_val:=curr_val * 10 + (s [j] dưới dạng số)
-
nếu curr_val trong phạm vi từ 1 đến k, thì
-
dp [i]:=(dp [i] + dp [j + 1]) mod m
-
-
nếu không,
-
đi ra từ vòng lặp
-
-
-
-
trả về dp [0]
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
class Solution: def solve(self, s, k): m = 10 ** 9 + 7 N = len(s) dp = [0] * (N + 1) dp[N] = 1 for i in range(N − 1, −1, −1): curr_val = 0 for j in range(i, N): curr_val = curr_val * 10 + int(s[j]) if 1 <= curr_val <= k: dp[i] = (dp[i] + dp[j + 1]) % m else: break return dp[0] ob = Solution() s = "3456" k = 500 print(ob.solve(s, k))
Đầu vào
"3456", 500
Đầu ra
7