今天是我第一次这么快就做完了一道动态规划的题……我只能说递归真香😀(告诉以前那个不用递归地自己)
今天的题目如下所示:
这道题看似要把最终的字符串给翻译出来,但是实际上并不需要,因为我们只需要考虑输入的数字可以怎么样拆分成不同的数字来进行翻译就可以了。比如说图上的示例,12258可以分成:(1,2,2,5,8),我们只要知道可以这样分就可以了,并不需要去翻译。
因为每一次的步长和最终字符串长度都会有不同,因此我们可以认为最后能正常输出的结果都是不同的,所以可以直接考虑上所有可能的正常输出结果,而不需要去去重。
在这题里,我用了递归来解题。我用一个小列表记录把给定数字拆散的过程,在拆完了之后,就把小列表加入到一个最终的大列表中。最后对大列表中的小列表进行计数,就能得到最终结果啦!这里有两个步长,就是分成0-9和10-25两种情况来考虑下一步要怎么走。
下面是我的代码:
class Solution:
def translateNum(self, num: int) -> int:
str_num = str(num)
final = []
self.judge(str_num, [], final)
return len(final)
def judge(self, strs, small_list, big_list):
#分一位数和两位数的情况来考虑,如果要输出一个两位数,注意它的值要不小于10
if strs == '':
big_list.append(small_list)
else:
self.judge(strs[1:], small_list + [strs[0]], big_list)
if len(strs) >= 2 and int(strs[:2]) < 26 and int(strs[:2]) > 9:
self.judge(strs[2:], small_list + [strs[:2]], big_list)
用了好几次递归之后,感觉越来越熟练了,这道题也是一看到就想到了用递归来解决。看来刷题还是很有用的🤭