1 问题
有一种将字母编码成数字的方式:‘a’->1, ‘b->2’, … , ‘z->26’。
现在给一串数字,返回有多少种可能的译码结果
数据范围:字符串长度满足 0<n≤90
进阶:空间复杂度 O(n),时间复杂度 O(n)
示例1
输入:“12”
返回值:2
说明:2种可能的译码结果(”ab” 或”l”)
示例2
输入:“31717126241541717”
返回值:192
说明:192种可能的译码结果
2 答案
这题直接不会,没有想清楚状态转移方程
官方解,动态规划
对于普通数组1-9,译码方式只有一种,但是对于11-19,21-26,译码方式有可选择的两种方案,因此我们使用动态规划将两种方案累计。
- step 1:用辅助数组dp表示前i个数的译码方法有多少种。
- step 2:对于一个数,我们可以直接译码它,也可以将其与前面的1或者2组合起来译码:如果直接译码,则dp[i]=dp[i−1];如果组合译码,则dp[i]=dp[i−2]。
- step 3:对于只有一种译码方式的,选上种dp[i−1]即可,对于满足两种译码方式(10,20不能)则是dp[i−1]+dp[i−2]
- step 4:依次相加,最后的dp[length]即为所求答案。
class Solution:
def solve(self , nums: str) -> int:
if nums == "0":
return 0
if nums == "10" or nums == "20":
return 1
for i in range(1, len(nums)):
if nums[i] == '0':
if nums[i-1] != '1' and nums[i-1] != '2':
return 0
dp = [1 for _ in range(len(nums) + 1)]
for i in range(2, len(nums)+1):
if (nums[i-2] == '1' and nums[i-1] > '0') or (nums[i-2] == '2' and nums[i-1] > '0' and nums[i-1] < '7'):
dp[i] = dp[i-1] + dp[i-2]
else:
dp[i] = dp[i-1]
return dp[len(nums)]
https://www.nowcoder.com/share/jump/9318638301699334607310