面试题46:把数字翻译成字符串

题目:给定一个数字,按照如下规则翻译成字符串:

0->a

1->b

...

25->z

因此一个数字可能有多种翻译。例如,12258有5种不同的翻译,bccfi,bwfi,bczi,mcfi,mzi。

请实现一个函数,计算数字有多少种翻译方法。

 

可以用递归解决,会发现子问题258 58都重复了。

自然想到可以用动态规划来解决,用f(i)来表示从第i位数字开始不同的翻译数目,

 

g(i,i+1)表示第i位和i+1位拼起来的数字在10~25范围内,值为1,否则为0。

 

按照剑指offer上的思路,先从最后一位开始,然后依次向前推:

f(5) = 1, f(4) = 1

f(3) = f(4) + 0 = 1

f(2) = f(3) + f(4) = 2

f(1) = f(2) + f(3) = 3

f(0) = f(1) + f(2) = 5 

int GetTranslationCount(int number){
    if (number < 0)
        return 0;
    string numberString = to_string(number);
    return GetTranslationCount(numberString);
}

int GetTranslationCount(const string& number){
    int length = number.length();
    int* f = new int[length];
    int count = 0;

    for (int i = length - 1; i >= 0; i--){
        count = 0;
        i < length - 1 ? count = f[i + 1] : count = 1;
        if (i < length - 1)
        {
            int digit1 = number[i] - '0';
            int digit2 = number[i + 1] - '0';
            int converted = digit1 * 10 + digit2;
            if (converted >= 10 && converted <= 25){
                i < length - 2 ? count += f[i + 2] : count += 1;
            }
        }
        f[i] = count;
    }
    count = f[0];
    delete[] f;

    return count;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值