Decode Ways

A message containing letters fromA-Zis being encoded to numbers using the following mapping:

'A' -> 1
'B' -> 2
...
'Z' -> 26

Given a non-empty string containing only digits, determine the total number of ways to decode it.

Example 1:

Input: "12"
Output: 2
Explanation: It could be decoded as "AB" (1 2) or "L" (12).

Example 2:

Input: "226"
Output: 3
Explanation: It could be decoded as "BZ" (2 26), "VF" (22 6), or "BBF" (2 2 6).

Analysis

Dynamic Programming - 1

dp[i]代表string s从0到i能够decode的数目, number of ways to decode string from 0 to i (included)

状态转移方程 dp[i] = if (s.substring(i, i + 1) is valid decode) then dp[i - 1] else 0 + if (s.substring(i - 1, i + 1) is valid decode) then dp[i - 2] else 0

Dynamic Programming - 2 (Preferred, more succinct, clear, no need of hashset)

Ref: https://leetcode.com/problems/decode-ways/discuss/30358/Java-clean-DP-solution-with-explanation

Use a dp array of size n + 1 to save subproblem solutions.

dp[0] - means an empty string will have one way to decode,

dp[1]- means the way to decode a string of size 1. I then check one digit and two digit combination and save the results along the way. In the end,

dp[n] - will be the end result.

Dynamic Programming - 3

dp[i] - 从0i个字符对应的decode ways。因此dp[]的size是n,而不是n+1

和第二种方法类似,但是用charAt(i)来得到对应位置字符,运行效率更高:

并且可以用滚动数组优化空间复杂度为O(1)。

时间复杂度 O(n)。

Solution

Dynamic Programming - 1 - O(n) space O(n) time

Dynamic Programming - 2 - O(n) space, O(n) time

substring 是 O(k) 时间复杂度,其中k是substring长度。

*Dynamic Programming - 3 - Reference - O(n) space, O(n) time

0 ms, faster than 100.00%

Dynamic Programming - 3 - space optimized - O(1) space, O(n) time

-- 根据上一种方法,发现只需要dp[0], dp[1], dp[2] 三个元素存储中间状态即可,因此可以用滚动数组优化空间。

Space: O(1)

Time: O(n)

Memory Usage: 33.5 MB, less than 89.69%

Runtime: 0 ms, faster than 100.00%

Last updated

Was this helpful?