สมมติว่าเรามีการแมปเช่น 'a' =1 'b' =2, ... 'z' =26 และเรามีสตริงข้อความที่เข้ารหัส เราต้องนับจำนวนวิธีที่จะถอดรหัสได้พี>
ดังนั้น หากอินพุตเป็นเหมือน message ="222" เอาต์พุตจะเป็น 3 เนื่องจากสามารถถอดรหัสได้ 3 วิธี:bbb, bv และ vb
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
memo :=รายการขนาด 0s เท่ากับขนาดข้อความ + 1
-
บันทึก[0] :=1
-
memo[1] :=1 เมื่อข้อความ[0] ไม่เหมือนกับ "0" มิฉะนั้น 0
-
สำหรับฉันอยู่ในช่วง 2 ถึงขนาดของข้อความ ทำ
-
n1 :=ค่าตัวเลขของข้อความ[จากดัชนี i-1 ถึง i]
-
n2 :=ค่าตัวเลขของข้อความ[จากดัชนี i-2 ถึง i]
-
n1_valid:=true เมื่อ n1> 0
-
n2_valid:=true เมื่อ n2> 9 และ n2 <27
-
ถ้า n1_valid เป็นจริง
-
บันทึก[i] :=บันทึก[i] + บันทึก[i-1]
-
-
ถ้า n2_valid เป็นจริง
-
บันทึก[i] :=บันทึก[i] + บันทึก[i-2]
-
-
-
ส่งคืนองค์ประกอบสุดท้ายของบันทึกช่วยจำ
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
class Solution: def solve(self, message): memo = [0 for i in range(len(message)+1)] memo[0] = 1 memo[1] = 1 if message[0]!="0" else 0 for i in range(2,len(message)+1): n1 = int(message[i-1:i]) n2 = int(message[i-2:i]) n1_valid= n1>0 n2_valid= n2>9 and n2<27 if n1_valid: memo[i]+=memo[i-1] if n2_valid: memo[i]+=memo[i-2] return memo[-1] ob = Solution() message = "2223" print(ob.solve(message))
อินพุต
"2223"
ผลลัพธ์
5