C++面试题(32)-------把数字翻译成字符串

  • 操作系统:ubuntu22.04
  • IDE:Visual Studio Code
  • 编程语言:C++11

题目描述

给定一个数字,它要么作为一个数字单独翻译成一个字符(‘a’ ~ ‘z’),要么和后面一位组合,翻译成另一个字符。

规则如下:

数字 0 → 'a'
数字 1 → 'b'
...
数字 25 → 'z'

例如:

12258 可以翻译为 "bccfi"、"wafi"、"bczi"、"wcfi" 等。

请输出这个数字能翻译成多少种不同的字符串?
示例:

输入: 12258
输出: 5

解释:

12258 → "bccfi"
12258 → "wafi"
12258 → "bczi"
12258 → "wcfi"
12258 → "wbfi"

解法思路:动态规划(DP)

这是一道典型的动态规划问题,与“爬楼梯”、“斐波那契数列”类似,具有重叠子结构和最优子结构特性。
定义状态:

设 dp[i] 表示从数字的第 i 位开始到末尾可以翻译成的不同字符串数量。
状态转移方程:

  • 单个数字可以翻译:dp[i] = dp[i+1]
  • 如果当前两位组成的数字在 [10, 25] 范围内,则也可以一起翻译:dp[i] += dp[i+2]

边界条件:

  • dp[n] = 1(空字符串有一种翻译方式)
  • dp[n-1] = 1(最后一个数字只有一种翻译方式)

实现代码

#include <string>
#include <vector>

using namespace std;

class Solution {
public:
    int translateNum( int num )
    {
        string s = to_string( num );
        int n    = s.size();
        vector< int > dp( n + 1, 0 );

        // 初始化边界
        dp[ n ]     = 1;
        dp[ n - 1 ] = 1;

        for ( int i = n - 2; i >= 0; --i )
        {
            // 单独翻译当前位
            dp[ i ] = dp[ i + 1 ];

            // 判断是否可以两个数字一起翻译
            int twoDigit = stoi( s.substr( i, 2 ) );
            if ( twoDigit >= 10 && twoDigit <= 25 )
            {
                dp[ i ] += dp[ i + 2 ];
            }
        }

        return dp[ 0 ];
    }
};

#include <iostream>

int main() {
    Solution sol;
    cout << sol.translateNum(12258) << endl; // 输出 5
    cout << sol.translateNum(0) << endl;     // 输出 1
    cout << sol.translateNum(5) << endl;     // 输出 1
    cout << sol.translateNum(25) << endl;    // 输出 2
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

村北头的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值