剑指Offer46.把数字翻译成字符串 C++

1、题目描述

给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
示例 1:
输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi”

2、VS2019上运行

使用动态规划

#include 
#include 
using namespace std;

class Solution {
public:
    int translateNum(int num) {
        string src = to_string(num); // 将输入的整数转换为字符串

        int p = 0, q = 0, r = 1; // 初始化三个变量,用于记录不同长度的转换方式数量

        for (int i = 0; i < src.size(); ++i) {
            p = q; // p 表示上一个数字字母的转换方式数量
            q = r; // q 表示当前数字字母的转换方式数量
            r = 0; // r 表示当前数字与前一个数字组成的两个数字字母的转换方式数量,默认为0

            r += q; // 当前数字以单独一个字母的方式转换,转换方式数量加上 q

            if (i == 0) { // 当前数字是第一个数字,不需要考虑组合转换的情况
                continue;
            }

            auto pre = src.substr(i - 1, 2); //从 src 字符串中提取以 i - 1 为起始位置的连续两个字符
           

            if (pre <= "25" && pre >= "10") { // 如果组成的两个字母是在 10 到 25 之间的,表示可以进行组合转换
                r += p; // 转换方式数量加上 p
            }
        }

        return r; // 返回最终的转换方式数量
    }
};

int main() {
    Solution s;
    int num = 12258;
    int result = s.translateNum(num);
    cout << "Number of translation ways: " << result << endl;
    return 0;
}

Number of translation ways: 5

3、解题思路

类似于青蛙跳台阶问题,但是这里能不能跳两个需要判断一下。
前半部分是一个字母的问题,也就是f(i-1)
后半部分是两个字母问题,判断一下是否能加上f(i-2)
f(i)=f(i-1)+f(i-2)

  • 1.将输入的整数转换为字符串,方便进行处理。
  • 2.初始化三个变量 p、q 和 r,用于记录不同长度的转换方式数量。初始时,p、q 和 r 都分别设为 0、0 和 1,表示长度为 0 的数字有一种转换方式。
  • 3.使用循环遍历字符串中的每个字符,从左到右依次处理。
  • 4.在循环中,首先将 p 的值赋给 q,将 q 的值赋给 r,表示更新转换方式数量的状态。
  • 5.然后,将 r 的值加上 q,表示当前数字以单独一个字母的方式转换,转换方式数量加上 q。
  • 6.如果当前数字不是第一个数字(即 i != 0),则提取当前数字与前一个数字组成的两个字符,判断这两个字符组成的数值是否在 10 到 25 之间。
  • 7.如果是,则表示可以进行组合转换。此时,将 r 的值加上 p,表示考虑了以当前数字与前一个数字组成的两个字母进行转换的方式数量。
  • 8.完成循环后,返回最终的转换方式数量 r。

你可能感兴趣的:(剑指Offer刷题,c++,开发语言,动态规划,力扣)