剑指offer:把数字翻译成字符串
admin
2023-07-07 05:22:44
0

题目要求:
给定一个数字,按照如下规则翻译成字符串:0翻译成“a”,1翻译成“b”...25翻译成“z”。一个数字有多种翻译可能,例如12258一共有5种,分别是bccfi,bwfi,bczi,mcfi,mzi。实现一个函数,用来计算一个数字有多少种不同的翻译方法。

# -*- coding: utf-8 -*-
# @Time         : 2019-07-10 21:13
# @Author       : Jayce Wong
# @ProjectName  : job
# @FileName     : getTranslationCount.py
# @Blog         : https://blog.51cto.com/jayce1111
# @Github       : https://github.com/SysuJayce

def getTranslationCount(number):
    """
    要将一个数字转化成一个字符串,由于这个数字有很多位,我们最直观的就是从头开始,一位一位地去转化。
    比如给定12258. 我们可以先把1翻译成b,然后剩下2258;也可以先把12翻译成m,然后剩下258.。。

    由此可见是一个递归问题,用递归的思路分析题目,用循环来解决问题(动态规划)
    递推公式为:f(i) = f(i+1) + g(i, i+1) x f(i+2)

    其中f(i)表示到下标为i的数字为止,共有多少种可能的翻译。之所以写成向前递推的公式,是因为如果我
    们从前往后翻译,会出现很多重复的子问题,比如12258=1 | 2258,其中2258=2 | 258,而12258=12 | 258,
    这样258就重复了。
    所以我们从后往前翻译,就可以避免这样的重复子问题。
    """
    def helper(s):
        # 一个数字至少有一种翻译,因此可以先设置一个全为1的数组,长度对应数字的位数加一
        counts = [1] * (len(s) + 1)
        # 对于前面的n-1位
        for i in range(len(s) - 2, -1, -1):
            # 第i位至少有和第i+1位一样多的翻译数
            count = counts[i + 1]
            # 如果第i位和第i+1位可以组合成一个10-25的数字,那么g(i, i+1) = 1
            # f(i) = f(i+1) + g(i, i+1) x f(i+2)
            # 由于我们设置的数组长度是位数+1,因此这里i+2不可能越界
            if 10 <= int(s[i: i + 2]) <= 25:
                count += counts[i + 2]
            counts[i] = count
        return counts[0]

    # 由于0对应a,25对应z,因此小于0的输入是无效的
    if number < 0:
        return 0

    return helper(str(number))

相关内容

热门资讯

我国科学家为细胞信号“导航”开... 新华社济南5月31日电(记者张力元)人体细胞犹如一座精密的通信城市,每天都有大量“指令”穿梭传递,调...
极端大风突袭哈尔滨!过山车停摆... 极目新闻记者 詹钘5月31日,受强对流天气影响,哈尔滨国际会展中心体育场相关设施受到损坏,原计划当晚...
三原电缆取得电缆接头连接用防护... 国家知识产权局信息显示,上海三原电缆附件有限公司取得一项名为“一种电缆接头连接用防护结构”的专利,授...
原创 识... 还是那句话,机圈苦大屏久已…… 虽然大屏有大屏的美,但是小屏也有小屏的俏。在大屏旗舰占据主流的手机市...
玄戒技术取得分频电路专利,实现... 国家知识产权局信息显示,北京玄戒技术有限公司取得一项名为“分频电路、分频器、射频芯片和电子设备”的专...
为什么今年香会基调明显变了 5月29日—31日在新加坡举行的第23届香格里拉对话会(简称“香会”),见证着元首引领下大国关系继续...
成本几毛钱、假驱蚊液香精兑水,... 入夏升温,蚊虫进入活跃期,驱蚊防护成为民生刚需,《财经调查》持续接到消费者投诉,他们买到的多款网红驱...
越来越多80后90后,正在丧失... 六一儿童节到来之际,朋友圈里开始出现一种熟悉的热闹。有人晒出零食礼包,有人半开玩笑地向伴侣讨礼物,还...
洋保电子取得用于低温环境的电气... 国家知识产权局信息显示,洋保电子(太仓)有限公司取得一项名为“一种用于低温环境的电气柜”的专利,授权...
中日韩飞手争霸宁波!2026无... 潮新闻客户端 记者 陈冲 通讯员 朱凝 5月31日,2026小遛·无人机竞速世界杯(中国·宁波鄞州站...