Giả sử chúng ta có một thông điệp chứa chữ cái từ A đến Z được mã hóa thành số theo ánh xạ sau: 'A' → 1, 'B' → 2 ... 'Z' → 26. Nếu chúng ta có một chuỗi không rỗng chỉ chứa chữ số, chúng ta phải tìm số cách mà chuỗi đó có thể được giải mã. Ví dụ, chuỗi "12" có thể tạo từ "AB" hoặc "L", nên có 2 cách. Câu trả lời là 2.
Để giải quyết, chúng ta làm theo các bước sau:
- Chúng ta sẽ giải quyết bằng quy hoạch động.
n:= độ dàis.dp:= mảng vớinsố 0.- Nếu
s[0]không phải'0', thìdp[0] := 1. - Với
itừ 1 đếnn-1:x:=s[i]dưới dạng số nguyên,y:= chuỗi con củastừ chỉ sối-1đếni+1dưới dạng số nguyên.- Nếu
x >= 1 và x <= 9, thìdp[i] := dp[i] + dp[i-1]. - Nếu
y >= 10 và y <= 26:- Nếu
i-2 >= 0, thìdp[i] := dp[i] + dp[i-2], ngược lại tăngdp[i]lên 1.
- Nếu
- Trả về phần tử cuối của
dp.
Ví dụ (Python)
Xem triển khai sau để hiểu rõ hơn:
class Solution(object):
def numDecodings(self, s):
n = len(s)
dp = [0 for i in range(n)]
if s[0] != '0':
dp[0] = 1
for i in range(1, n):
x = int(s[i])
y = int(s[i-1:i+1])
if x >= 1 and x <= 9:
dp[i] += dp[i-1]
if y >= 10 and y <= 26:
if i-2 >= 0:
dp[i] += dp[i-2]
else:
dp[i] += 1
return dp[-1]
ob1 = Solution()
print(ob1.numDecodings("226"))
Đầu vào
"226"
Đầu ra
3