Medium
首先分析一下题目,对于例子12258
1
或 12
,122
选不了了,因为122
超过了\([0, 25]\) 范围。1
,第二个可选2
或22
来翻译;如果第一个拿个12
来翻译,第二个可以选2
或25
来翻译。2258
的子分支也出现在258
的子分支当中,使用记忆化递归0
的情况需要考虑进去尝试使用递归求解,AC!
python3
class Solution:
@lru_cache(None)
def dfs(self, res):
if res == '':
return 1
if int(res) < 10:
return 1
result = 0
if int(res[0:2]) < 26 and int(res[0:2]) > 9:
result += self.dfs(res[2:])
result += self.dfs(res[1:])
return result
def translateNum(self, num: int) -> int:
return self.dfs(str(num))
细心的小伙伴发现我们这道题放在了dp类别中,我们这题也可以使用动态规划来做。(很多的dp题,我们都可以先考虑记忆化递归的方法,然后再转化成bottom-up 动态规划方法,这样个人感觉思路会比较清晰)
8
为最小的元素,从下向上计算dp[i]
表示翻译到第i个数字时,可能的翻译数量dp[i]
来说,有两种可能性:可能是从dp[i-1]
然后再加上第i
个数字翻译过来,也有可能从dp[i-2]
然后再加上第i-1
和i
个数字,组成的翻译i-1
和第i
个数子组成的数字,在[10,25]
返回内才满足上述的第二种可能性dp[0] = 1
, 为了符合通项,我们设置0的情况的值为1
尝试编写一下代码,AC!python3
class Solution:
def translateNum(self, num: int) -> int:
dp = [0] * (len(str(num)) + 1)
dp[0] = 1
dp[1] = 1
for i in range(2, len(str(num)) + 1):
temp = int(str(num)[i-2:i])
if temp > 9 and temp < 26:
dp[i] += dp[i-2]
dp[i] += dp[i-1]
print(dp)
return dp[-1]