## 91. Decode Ways ###### tags: `Dynamic Programming` `Medium` >[91. Decode Ways](https://leetcode.com/problems/decode-ways/description/) <br> :::info :::spoiler *Optimal Space & Time Complexity* <br> ``` - Time complexity: O() - Space complexity: O() ``` ::: <br> ## Thoughts & Solutions ### YC :::spoiler Code ```javascript= ``` ::: <hr/> ### Sol :::spoiler Code ```javascript= ``` ::: <hr/> ### 東 `dp(n)` = `s[n] is valid` && `dp(n-1)` + `s.slice(n-1, n+1) is valid` && `dp(n-2)` ``` dp(0) = 1 // 1 dp(1) = 2 // (1,1) (11) dp(2) = 2 + 1 = 3 // (1, 1, 1)(11,1) (1, 11) dp(3) = 0 + 2 = 2 // (1, 1, 10)(11, 10) dp(4) = 2 + 0 = 2 // (1, 1, 10, 6) (11, 10, 6) ``` :::spoiler Code ```javascript= // Time O(n) | Space O(n) - n is the length of input string var numDecodings = function(s) { const dp = new Array(s.length).fill(0); if(isValidDecode(s[0])) { dp[0] = 1; } if(s.length === 1) return dp[0]; if(dp[0] && isValidDecode(s[1])) dp[1]++; if(isValidDecode(s.slice(0, 2))) dp[1]++; for(let i = 2; i < s.length; i++) { if(isValidDecode(s[i])) { dp[i] += dp[i-1]; } if(isValidDecode(s.slice(i - 1, i + 1))) { dp[i] += dp[i-2]; } } return dp[s.length - 1]; }; function isValidDecode(s) { if(s[0] === "0") return false; if(Number(s) === 0 || Number(s) > 26) return false; return true; } ``` ::: <hr/> ### Jessie :::spoiler Code ```javascript= ``` ::: <hr/> ### Howard :::spoiler Code ```python= ``` ::: <hr/> ### Haoyu :::spoiler Code Reference: https://leetcode.com/problems/decode-ways/solutions/4454037/97-43-easy-solution-with-explanation/ ```javascript= var numDecodings = function(s) { if (!s || s[0] === '0') { return 0; } const n = s.length; const dp = new Array(n + 1).fill(0); dp[0] = 1; dp[1] = 1; for (let i = 2; i <= n; ++i) { const oneDigit = parseInt(s[i - 1]); const twoDigits = parseInt(s.substring(i - 2, i)); if (oneDigit !== 0) { dp[i] += dp[i - 1]; } if (10 <= twoDigits && twoDigits <= 26) { dp[i] += dp[i - 2]; } } return dp[n]; }; ``` ::: <hr/> <br> ## Live Coding :::spoiler (name) ``` // write your code here ``` :::