Decode Ways
A message containing letters fromA-Zis being encoded to numbers using the following mapping:
'A' -> 1
'B' -> 2
...
'Z' -> 26Given 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] - 从0到i个字符对应的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?