Decode Ways

Description:

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.

Ex:

Given encoded message “12”, it could be decoded as “AB” (1 2) or “L” (12).

The number of ways decoding “12” is 2.

问题描述:

解码方式,26个字母的映射表已经给出了,现在给一串包含数字的编码后的字符串,问有多少种解码方式。
比如给编码信息”12”,既可以译码为ab又可以译码为l,所以共有2种译码方式。

解法一:

思路:

对一串数字而言,要么提取一位,要么提取两位(有效字符),所以该问题可以用动态规划解决,初始化dp[n+1]的数组和dp[0]、dp[1],然后开始遍历,
如果提取的一位数字(first)合法,则dp[i] += dp[i-1];
如果提取的两位数字合法,则dp[i] += dp[i-2];

最后返回dp[n]

这个问题其实和原先的凑硬币问题是有点像的,只不过这里是编码方式,无需+1(凑硬币问题求的是硬币数量)

Code:

public class Solution {
    public int numDecodings(String s) {
        if(s == null || s.length() == 0){
            return 0;
        }
        int n = s.length();
        int[] dp = new int[n+1];
        dp[0] = 1;
        dp[1] = s.charAt(0) != '0' ? 1 : 0;

        for(int i = 2; i <= n; i++){
            int first = Integer.valueOf(s.substring(i-1,i));
            int second = Integer.valueOf(s.substring(i-2,i));
            if(first >= 1 && first <= 9){
                dp[i] += dp[i-1];
            }
            if(second >= 10 && second <= 26){
                dp[i] += dp[i-2];
            }

        }
        return dp[n];

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值