91. Decode Ways
A message containing letters from A-Z
is being encoded to numbers using the following mapping:
'A' -> 1 'B' -> 2 ... 'Z' -> 26
Given an encoded message containing digits, determine the total number of ways to decode it.
For example,
Given encoded message "12"
, it could be decoded as "AB"
(1 2) or "L"
(12).
The number of ways decoding "12"
is 2.
题目含义:给你一串数字,解码成英文字母
分析
如果string中没有‘0’的存在,这道题就是简单的爬楼梯问题70. Climbing Stairs 并且其动归方程可以简单的记为:dp(i+1)=dp(i)+dp(i-1)
现在分析连续出现的两位数int tmp
那么它存在以下几种情况:
情况一
10 <= tmp <= 26 这个时候一定满足一个条件,dp(i)至少包含了dp(i-2)的内容,例如当子串为xxxx26,则一定能完成编码xxxxZ,而xxxx编码的个数为dp(i-2)。也就是说,从d[i-2]再跳一步(两位数26作为一个编码Z)可到达dp[i], 即dp[i] = dp[i] + dp[i-2]
情况二
1 <= tmp <= 9 ,例如当子串为xxxx26,则一定能完成编码xxxxBF,而xxxxB编码的个数为dp(i-1)。也就是说,从从d[i-1]再跳一步(单个位数6作为一个编码F)可到达dp[i], 即dp[i] = dp[i] + dp[i-1]
1 public int numDecodings(String s) { 2 if(s == null || s.length() == 0 || s.charAt(0) == '0') { 3 return 0; 4 } 5 int n = s.length(); 6 int[] dp = new int[n+1]; 7 dp[0] = 1; 8 dp[1] = 1; 9 for(int i = 2; i <= n; i++) { 10 int first = Integer.valueOf(s.substring(i-1, i)); 11 int second = Integer.valueOf(s.substring(i-2, i)); 12 if(first >= 1 && first <= 9) { 13 dp[i] += dp[i-1]; 14 } 15 if(second >= 10 && second <= 26) { 16 dp[i] += dp[i-2]; 17 } 18 } 19 return dp[n]; 20 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!