AcWing练习——把数字翻译成字符串(动态规划)
题目描述:
给定一个数字,我们按照如下规则把它翻译为字符串:
0翻译成 a
,1翻译成 b
,……,11翻译成 i
,……,25翻译成 z
。
一个数字可能有多个翻译。例如 “12258“有种不同的翻译,它们分别是 bccfi
、bwfi
、bczi
、mcfi
和 mzi
。
请编程实现一个函数用来计算一个数字有多少种不同的翻译方法。
样例
输入:"12258"
输出:5
本题解法
DP O(N)
还记得经典的爬楼梯(斐波那契数列)吗?每次可以走1步或者2步,问n个台阶一共有多少种爬楼梯的方法?
dp[i]=dp[i-1]+dp[i-2]
这道题相当于加了一些限制条件。
这个题可以正推或者倒推,我采用的方法是倒着推
以dp[i]表示从字符串i位开始到末尾,最大的翻译次数。
dp[i] = dp[i+1] // default, 比如都是67876878,这种只有1种解码方式,不会增加 = dp[i+1] + dp[i+2] // when s[i]=='1'||(s[i]=='2'&&s[i+1]<'6') 这种情况的出现会使解码次数增加举个例子12xxxxxx;将1作为单独的一个数看,解码方法和2xxxxxx相同;将12作为一个整体看,解码方法数量和xxxxxx相同。最终的数量是二者之和。
AC代码:
1 class Solution { 2 public int getTranslationCount(String s) { 3 char[] c = s.toCharArray(); 4 int n = c.length; 5 int[] dp = new int[n + 2]; 6 7 dp[n] = 1; 8 for (int i = n - 1; i >= 1; i--) { 9 // 一开始默认就等于后面那个位置的dp值 10 dp[i] = dp[i + 1]; 11 if (c[i - 1] == '1' || (c[i - 1] == '2' && c[i] < '6')) { 12 if (i + 2 <= n) { 13 dp[i] += dp[i + 2]; 14 } else { 15 dp[i] += 1; 16 } 17 } 18 } 19 return dp[1]; 20 } 21 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能