Skip to main content
A cup of beer
  1. ACM Hub/

🎉|LeetOffer46|把数字翻译成字符串

·110 words·1 min
Table of Contents

难度:Mid

题目 #

给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。

示例 1:

输入: 12258 输出: 5 解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi”

技巧 #

  • 函数to_string是头文件string下的方法。它将各种类型的数字转换成string对象返回。**这样一来,就能很方便地以位为单位来处理数字。**在DP中很好用了属于是。
  • string对象可以比较大小。类似于strcmp。

思路 #

  • 状态定义:dp[i]即到数字的第i位为止,可以翻译出的种类数。
  • 若第i位能和i-1位连起来翻译,那么此时i-2位就不能和i-1位连起来,即种类数和到第i-2位是一样的;若第i位不和i-1位连起来,那种类数和到i-1为止是一样的。

代码实现 #

#include <bits/stdc++.h>
using namespace std;

class Solution {
    int dp[40];
public:
    int translateNum(int num) {
        string snum = to_string(num);
        int n = snum.length();
        dp[0] = 1;
        for(int i=1;i<n;i++){
            if (i == 1 && snum.substr(i - 1,2)>="10" && snum.substr(i - 1,2)<="25")
                dp[1] = 2;
            else if(i >= 2 && snum.substr(i - 1,2)>="10" && snum.substr(i - 1,2)<="25")
                dp[i] = dp[i - 2] + dp[i - 1];
            else
                dp[i] = dp[i - 1];
        }
        return dp[n - 1];
    }
};