剑指offer——把数字翻译成字符串(c++)

本文介绍了一种使用动态规划算法解决数字翻译问题的方法,即如何将一个数字按照特定规则翻译成字符串,探讨了递推公式和实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

思路

动态规划,从最小的问题开始 :f( r )表示以r为开始(r最小取0)到最右端所组成的数字能够翻译成字符串的种数。对于长度为n的数字,f(n)=0,f(n-1)=1,求f(0)。
递推公式为 f(r-2) = f(r-1)+g(r-2,r-1)*f( r );
其中,如果r-2,r-1能够翻译成字符,则g(r-2,r-1)=1,否则为0。
因此,对于12258:
f(5) = 0
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

class Solution{
public:
    int Get(int num){
        if(num < 0)
            return 0;
        string str = to_string(num);
        int res = GetCount(str);
        return res;
    }

private:
    int GetCount(const string& str){
        int n = str.length();
        vector<int> counts(n+1, 0);
        for(int i = n - 1; i >= 0; --i){
            if(i == n - 1)
                counts[i] = 1;
            else
                counts[i] = counts[i+1] + help(str, i, i+1) * (i == n-2 ? 1 : counts[i+2]);
        }
        return counts[0];
    }
    int help(const string& str, int i, int j){
        int num1 = str[i] - '0';
        int num2 = str[j] - '0';
        int num = num1 * 10 + num2;
        if(num <= 25 && num >= 10)
            return 1;
        else
            return 0;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值