สมมติว่าเรามีข้อความที่มีตัวอักษร A ถึง Z ถูกเข้ารหัสเป็นตัวเลขด้วย mapping: 'A' → 1, 'B' → 2 ... 'Z' → 26 ถ้าเรามีสตริงไม่ว่างที่ประกอบด้วยตัวเลขเท่านั้น เราต้องหาว่าสามารถถอดรหัสได้กี่วิธี ตัวอย่าง สตริง "12" สามารถสร้างจาก "AB" (1, 2) หรือ "L" (12) ดังนั้นมี 2 วิธี
ขั้นตอนการทำงาน (Dynamic Programming)
- แก้ด้วย Dynamic Programming
n := length of sdp := arrayขนาด n เติม 0- ถ้า
s[0] != '0'ให้dp[0] := 1 - วนลูป
iจาก 1 ถึงn-1:x := s[i] as integer,y := substring s[i-1:i+1] as integer- ถ้า
1 ≤ x ≤ 9ให้dp[i] := dp[i] + dp[i-1] - ถ้า
10 ≤ y ≤ 26:- ถ้า
i-2 ≥ 0ให้dp[i] := dp[i] + dp[i-2]มิฉะนั้นเพิ่มdp[i]1
- ถ้า
- คืนค่าองค์ประกอบสุดท้ายของ
dp
ตัวอย่างโค้ด (Python)
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 1 <= x <= 9:
dp[i] += dp[i-1]
if 10 <= y <= 26:
if i-2 >= 0:
dp[i] += dp[i-2]
else:
dp[i] += 1
return dp[-1]
ob1 = Solution()
print(ob1.numDecodings("226"))
อินพุต
"226"
เอาต์พุต
3