fork download
  1. def count_decodings(digits: str) -> int:
  2. # Отримати довжину вхідного рядка
  3. n = len(digits)
  4.  
  5. # 1. Обробка початкових обмежень
  6. # Якщо рядок порожній або починається з '0', декодування неможливе.
  7. if n == 0 or digits[0] == '0':
  8. return 0
  9.  
  10. # Створюємо масив DP. dp[i] - кількість способів для префікса довжиною i
  11. dp = [0] * (n + 1)
  12.  
  13. # 2. Базові випадки
  14. dp[0] = 1 # Пустий рядок (точка старту)
  15. dp[1] = 1 # Перша цифра (ми вже перевірили, що вона не '0')
  16.  
  17. # 3. Ітерація та застосування рекурентного співвідношення
  18. for i in range(2, n + 1):
  19. # i-1 - індекс останньої цифри
  20. # i-2 - індекс передостанньої цифри
  21.  
  22. # --- Варіант 1: Крок на 1 (Одноцифровий) ---
  23. one_digit = int(digits[i-1:i]) # Отримати останню цифру
  24.  
  25. # Умова: цифра має бути від 1 до 9
  26. if 1 <= one_digit <= 9:
  27. dp[i] += dp[i-1]
  28.  
  29. # --- Варіант 2: Крок на 2 (Двоцифровий) ---
  30. two_digits = int(digits[i-2:i]) # Отримати дві останні цифри
  31.  
  32. # Умова: число має бути від 10 до 26
  33. if 10 <= two_digits <= 26:
  34. dp[i] += dp[i-2]
  35.  
  36. # Якщо dp[i] залишається 0, це означає, що на позиції i
  37. # немає дійсних шляхів (наприклад, "30").
  38. if dp[i] == 0:
  39. return 0
  40.  
  41. # Результат - кількість способів декодувати весь рядок
  42. return dp[n]
  43.  
  44. # Приклади для перевірки:
  45. # print(f"\"121\": {count_decodings('121')}") # 3
  46. # print(f"\"1234\": {count_decodings('1234')}") # 3
  47. # print(f"\"230\": {count_decodings('230')}") # 0
Success #stdin #stdout 0.11s 14060KB
stdin
12
stdout
Standard output is empty