当前位置: 首页 > news >正文

题解:学而思编程 单词解密

【题目来源】

学而思编程:单词解密

【题目描述】

小猴发明了一套对字母的加密系统,其本质就是用字母在字典序中的编号来代替该字母,即用 \(1∼26\) 代替 \(a∼z\)

例如,单词 codec 是第 \(3\) 个字母,o 是第 \(15\) 个字母,d 是第 \(4\) 个字母,e 是第 \(5\) 个字母,因此 code 经过加密后,得到的密文为 \(31545\)

但是小猴发现,这样加密后的信息,可能会有多种解读,密文为 \(31545\) 除了 code 还可以是 caede,因此在解密时,有两种可能性。

现在,小猴给你一串密文,请你帮助小猴计算出所有可能的明文的种数对 \(10^9+7\) 取模。

【输入】

输入共一行,一串数字表示密文,保证一定有解。

【输出】

输出共一行,一个正整数表示答案。

【输入样例】

31545

【输出样例】

2

【核心思想】

  1. 问题分析:给定一个数字密文串 \(s\),每个数字可以单独翻译为对应字母(\(1 \to a, 2 \to b, \ldots, 9 \to i\)),或者与前一个数字组合成两位数翻译(\(10 \to j, 11 \to k, \ldots, 26 \to z\))。求所有可能的解密方式数,结果对 \(10^9+7\) 取模。这是一个线性动态规划问题,类似于经典的解码方法问题。

  2. 算法选择

    • 动态规划(DP)\(dp[i]\) 表示前 \(i\) 个字符的解密方式数
    • 状态转移:根据当前字符是否为 \(0\) 以及能否与前一个字符组合,分情况讨论
  3. 关键步骤

    • 将输入数字转为字符串 \(s\),下标从 \(1\) 开始
    • 初始化\(dp[0] = 1\)(空字符串有 \(1\) 种解密方式),\(dp[1] = 1\)(第一个字符单独解密)
    • 状态转移(从 \(i = 2\)\(n\)):
      • \(s[i] = '0'\):当前字符必须与前一个组合,且前一个必须是 \('1'\)\('2'\)(组成 \(10\)\(20\)
        • \(dp[i] = dp[i-2]\)(只能组合解密)
      • 若能组合成 \(10\)-\(26\)\(s[i-1] = '1'\),或 \(s[i-1] = '2'\)\(s[i] \leq '6'\)):
        • \(dp[i] = (dp[i-1] + dp[i-2]) \mod MOD\)
        • \(dp[i-1]\)\(s[i]\) 单独解密的方式数
        • \(dp[i-2]\)\(s[i-1]\)\(s[i]\) 组合解密的方式数
      • 若不能组合\(dp[i] = dp[i-1]\)(只能单独解密)
    • 输出 \(dp[n]\) 作为答案
  4. 时间/空间复杂度

    • 时间复杂度:\(O(n)\),只需遍历字符串一次
    • 空间复杂度:\(O(n)\),使用 \(dp\) 数组(可优化至 \(O(1)\),只保留 \(dp[i-1]\)\(dp[i-2]\)
  5. 线性DP与含约束递推的核心思想

    • 最优子结构:前 \(i\) 个字符的解密数只与前 \(i-1\)\(i-2\) 个字符有关
    • 特殊约束处理:字符 \('0'\) 不能单独解密,必须与前一个组合成 \(10\)\(20\)
    • 状态转移分情况:根据当前字符的值和能否组合,决定转移方式
    • 取模运算:结果可能很大,每一步都要对 \(10^9+7\) 取模防止溢出
    • 适用于字符串解码、密码破解、组合计数等场景

【算法标签】

线性DP-一维

【代码详解】

#include<iostream>
#include<algorithm>
using namespace std;const int MOD = 1e9 + 7;  // 模数
string s;  // 输入的数字字符串
int n, dp[100005];  // 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种方式(假设不是'0')for (int i = 2; i <= n; i++){if (s[i] == '0')  // 如果当前字符是'0'{// 如果当前字符是'0',它必须和前一个字符组合// 且前一个字符只能是'1'或'2',否则无法解码// 解码方式数等于dp[i-2]dp[i] = dp[i - 2];}else if (s[i - 1] == '1' || s[i - 1] == '2' && s[i] <= '6'){// 如果前两个字符能组成10-26(除了20),则有两种解码方式:// 1. 当前字符单独解码:dp[i-1]种方式// 2. 前两个字符一起解码:dp[i-2]种方式dp[i] = (dp[i - 1] + dp[i - 2]) % MOD;}else{// 如果前两个字符不能组成有效数字,则当前字符必须单独解码dp[i] = dp[i - 1];}// cout<<dp[i]<<' ';  // 调试输出}cout << dp[n];  // 输出整个字符串的解码方式总数return 0;
}

【运行结果】

31545
2
http://www.zskr.cn/news/1523204.html

相关文章:

  • 2026宁德本地水质检测饮用水检测哪家强?TOP 正规机构榜单 + 联系方式 - 中安检测集团
  • Windows Cleaner:专治C盘爆红的免费系统清理神器
  • 题解:AtCoder AT_awc0081_c Spread of Rumors
  • 天地图、OpenStreetMap、ArcGIS Online,Web地图瓦片服务(WMTS/TMS/XYZ)到底怎么选?一个前端开发者的实战踩坑笔记
  • 题解:学而思编程 均富卡
  • 2026湖州厂区电能质量测试评估放心机构 TOP + 实地测评 + 详细地址电话 - 中检检测集团
  • 2026昌吉地区本地人常去的 5 家土壤检测农田污染场地检测第三方机构实体店实地测评汇总 - 科信检测
  • 5分钟掌握猫抓Cat-Catch:浏览器资源嗅探神器的完整使用指南
  • 从/dev/fb0到DRM:一个嵌入式工程师的Linux显示框架踩坑与选型指南
  • 天花板!2026 实验室装修公司推荐 5大企业实力透视+ 全场景选型秘籍 - 速递信息
  • 题解:学而思编程 奶牛杂技团
  • 2026吉林本地水质检测饮用水检测哪家强?TOP 正规机构榜单 + 联系方式 - 中安检测集团
  • 2026贵阳厂区电能质量测试评估放心机构 TOP + 实地测评 + 详细地址电话 - 中检检测集团
  • AMD Ryzen处理器调校终极指南:5步解锁隐藏性能的免费工具
  • 2026喀什本地水质检测饮用水检测哪家强?TOP 正规机构榜单 + 联系方式 - 中安检测集团
  • 2026潜江市迪奥+古驰+普拉达包包专业回收,2026甄选回收店铺排行榜推荐 - 奢金汇
  • 2026日喀则市爱马仕+香奈儿+路易威登LV包包专业回收,2026甄选回收店铺排行榜推荐 - 奢金汇
  • 题解:AtCoder AT_awc0082_d Corridor Doors and Hit Points
  • 数据科学转行真实路径图:3条可落地的实战路线
  • 为你的STM32小屏幕找个GUI:在1.8寸TFT上移植LVGL或U8g2的实战记录
  • 2026揭阳厂区电能质量测试评估放心机构 TOP + 实地测评 + 详细地址电话 - 中检检测集团
  • 飞腾D2000+银河麒麟V10开发笔记:网络编程时获取本机IP的几种方法对比
  • 视频转PPT:如何从3小时会议录像中提取出完美演示文稿
  • 终极QQ音乐解密指南:3分钟解锁你的加密音乐库
  • dendrogram如何提升销售预测准确率:产品相似性建模实战
  • skill 知识
  • 用GPT-Builder打造Plotly地理可视化AI助手
  • 基于PLC控制的汽车铰链自动压装机虚拟样机设计3124(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 企业级SSD批量供货与品质一致性FAQ
  • DOTA数据集标注避坑指南:HBB和OBB选错了,模型效果差一半