题解:解码方法

【题目描述】

给出一个数字 \(n\),我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",......,11 翻译成 "l",......,25 翻译成 "z"。一个数字可能有多个翻译。请编程计算一个数字有多少种不同的翻译方法。

例如102040有4种不同的翻译方法:分别是"bacaea", "bauea", "kcaea"和"kuea"。

【输入】

一行,一个整数 \(n\)

【输出】

一个整数,翻译方法数

【输入样例】

102040

【输出样例】

4

【代码详解】

#include<iostream>
#include<algorithm>
using namespace std;

string s;  // 输入的数字字符串
int n, dp[55];  // n: 字符串长度,dp: 动态规划数组

int main()
{
    cin >> s;  // 读入数字字符串
    n = s.size();  // 获取字符串长度
    s = ' ' + s;  // 在字符串前加一个空格,使下标从1开始
    
    dp[0] = dp[1] = 1;  // 初始化动态规划数组
    // dp[0] = 1: 空字符串有1种解码方式
    // dp[1] = 1: 第一个字符单独解码有1种方式
    
    for (int i = 2; i <= n; i++)
    {
        // 检查前两个字符是否能组成一个有效的两位数
        // 条件1: 前一个字符是'1',则当前字符可以是0-9
        // 条件2: 前一个字符是'2'且当前字符小于等于'5',则组成的数字是20-25
        if (s[i - 1] == '1' || s[i - 1] == '2' && s[i] <= '5')
        {
            // 如果前两个字符能组成有效数字,则有两种解码方式:
            // 1. 当前字符单独解码:dp[i-1]种方式
            // 2. 前两个字符一起解码:dp[i-2]种方式
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        else
        {
            // 如果前两个字符不能组成有效数字,则当前字符必须单独解码
            dp[i] = dp[i - 1];
        }
    }
    
    cout << dp[n];  // 输出整个字符串的解码方式总数
    return 0;
}

【运行结果】

102040
4
posted @ 2026-02-21 08:35  团爸讲算法  阅读(2)  评论(0)    收藏  举报