[Leetcode] Decode Ways

DecodeWays解题思路
本文解析了LeetCode上的DecodeWays题目,介绍了一种利用动态规划求解的方法。通过递推公式dp[i]=dp[i+1]+dp[i+2]来计算不同解码方式的数量。

Decode Ways 题解

题目来源:https://leetcode.com/problems/decode-ways/description/


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.

Example

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

The number of ways decoding "12" is 2.

Solution


class Solution {
public:
    int numDecodings(string s) {
        if (s.empty())
            return 0;
        int size = s.size();
        vector<int> dp(size + 1, 0);
        dp[size] = 1;
        dp[size - 1] = s[size - 1] == '0' ? 0 : 1;
        for (int i = size - 2; i >= 0; i--) {
            if (s[i] == '0') {
                continue;
            } else {
                if (s[i] == '1' || (s[i] == '2' && s[i + 1] <= '6'))
                    dp[i] = dp[i + 1] + dp[i + 2];
                else
                    dp[i] = dp[i + 1];
            }
        }
        return dp[0];
    }
};

解题描述

这道题题意是,给出一个数字串,求数字串能解码出多少种字母序列。这里给出的是DP的解法,其中关键就是求出可能会有2种情况的解码方式。讨论区给出的详细的解释是:

  • 给出例子123XXXX
  • 1这个位置上,向前探1位可以构成12,符合解码字符要求
  • 这样12可以被拆分为1 212,记1所在位置为i
    • 1 2而言,前面的解码方法对应从2开始的解法,有dp[i + 1]
    • 12而言,前面的解码方法对应从3开始的解法,有dp[i + 2]
  • 所以dp[i] = dp[i + 1] + dp[i + 2]

转载于:https://www.cnblogs.com/yanhewu/p/8372203.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值