Leetcode之Decode Ways 问题

来源:互联网 发布:数据库中的字典表使用 编辑:程序博客网 时间:2024/06/15 10:05

问题描述:

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.

问题来源:Decode Ways (详细地址:https://leetcode.com/problems/decode-ways/description/)

思路分析:这道题是字母和字符一一对应,然后给出指定字符串,解析其中的字符,有多少种不同的解析方法,我们用dp[]来表示。首先这是一道动态规划的题目?为什么呢?咱们来仔细分析一下,假设当前遍历到第i个字符,如果它前面的两个字符构成的子字符串所对应的数是<=26的,那么当前dp[i]的解法有dp[i-1]+dp[i-2]种。在这先解释一下为什么是这样的,假如字符串是123...这样的,当前遍历到字符‘3’,前面的两个字符为12<26,所以得到的解法有"1+23..."和"12+3..."两种;相反,如果不是小于等于26的话,那怎么办呢?假设现在变成了"323...",32明显是大于26的,所以我们只能解析成"3+23..."这一种,也就是说,当前的解析方法和前面的解析方法是一样的,即dp[i]=dp[i-1],所以动态规划的状态转移方程就得到了:

dp[i] = (Integer.parseInt(s.substring(i-2, i)) <= 26) ? dp[i-2] + dp[i-1] : dp[i-1];

介绍完状态方程了,下面介绍初始条件,上面的方程含i-2,所以我们需要初始化两个状态:先看看dp[1],即只含有一个字符,当然只能是一种解析办法了,但是如果是0的话,还能解析出来吗?所以:

dp[1] = s.charAt(0) == '0' ? 0 : 1;

dp[0]还是比较难理解的,在这我个人理解是由特例"12"得出,它是有两种解析办法的,即dp[2] = dp[0] + dp[1] =>dp[0] = 1;

综上所述,我们的初始化状态是:

                                                                                                                dp[0] = 1;

dp[1] = s.charAt(0) == '0' ? 0 : 1;

当然,我们这是由前往后的顺序走的,我们也可以从尾走到头。至此,我们基本上已经介绍完了,其他的我们还是看代码吧。

代码:

从前往后:

从后往前: