LeetCode 91. Decode Ways

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.


【题目分析】

给定一种字符到数字的编码方式,求出一个指定数字序列有多少种解码方式。

【思路】
用动态规划的思想来解决。

设定状态为:f[i]表示s0开始,长度为i的子串的解码方式数量,于是我们最终要求的答案便是f[n]

那么如何求解f[i]呢?这个很简单,枚举最后一个字母对应1位还是2位,将f转化为规模更小的子问题。

  • f[i] = 0
  • 枚举最后一个字母对应1位(要求s[i - 1] != '0'),那么有f[i] += f[i-1]
  • 枚举最后一个字母对应2位(要求i > 1s[i - 2]s[i - 1]组成的字符串在"10"~"26"的范围内),那么有f[i] += f[i - 2]

也就是说,我们可以通过f[i - 1]和f[i - 2]计算出f[i]来,这就是我们的状态和转移方程。

在具体实现中,我们可以按照i从1到n的顺序,依次计算出所有的f[i]。


【java代码】

 1 public class Solution {
 2     public int numDecodings(String s) {
 3         if(s.length() == 0) return 0;
 4         int[] f = new int[s.length()+1];
 5         f[0] = 1;
 6         
 7         for(int i = 1; i < f.length; i++) {
 8             if(s.charAt(i-1) != '0') {
 9                 f[i] += f[i-1];
10             }
11             if(i > 1 && s.substring(i-2, i).compareTo("10") >=0 && s.substring(i-2, i).compareTo("26") <= 0) {
12                 f[i] += f[i-2];
13             }
14         }
15         
16         return f[s.length()];
17     }
18 }

 

转载于:https://www.cnblogs.com/liujinhong/p/6096573.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值