leetcode面试准备:Decode Ways
1 題目
A message containing letters from A-Z is being encoded to numbers using the following mapping:
'A'?->?1'B'?->?2...'Z'?->?26Given 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.
接口:public int numDecodings(String s);
2 思路
一維動態規劃,偷懶了,照搬博文。
分析:需要注意的是,如果序列中有不能匹配的0,那么解碼方法是0,比如序列012 、100(第二個0可以和1組成10,第三個0不能匹配)。
遞歸的解法很容易,但是大集合會超時。轉換成動態規劃的方法,假設dp[i]表示序列s[0...i-1]的解碼數目
動態規劃方程如下:初始條件:dp[0] = 1, dp[1] = (s[0] == '0') ? 0 : 1
dp[i] = ( s[i-1] == 0 ? 0 : dp[i-1] ) + ( s[i-2,i-1]可以表示字母 ? dp[i-2] : 0 ), 其中第一個分量是把s[0...i-1]末尾一個數字當做一個字母來考慮,第二個分量是把s[0...i-1]末尾兩個數字當做一個字母來考慮
復雜度: Time O(n); Space O(n)
3 代碼
????????public?int?numDecodings(String?s)?{????????//?1.初始化final?int?len?=?s.length();????????if?(len?==?0)????????????return?0;????????int[]?dp?=?new?int[len?+?1];dp[0]?=?1;????????if?(s.charAt(0)?!=?'0')dp[1]?=?1;????????elsedp[1]?=?0;????????//?2.一維DP方程for?(int?i?=?2;?i?<=?len;?i++)?{????????????if?(s.charAt(i?-?1)?!=?'0')dp[i]?=?dp[i?-?1];????????????elsedp[i]?=?0;????????????if?(s.charAt(i?-?2)?==?'1'||?(s.charAt(i?-?2)?==?'2'?&&?s.charAt(i?-?1)?<=?'6'))dp[i]?+=?dp[i?-?2];}????????return?dp[len];}4 總結
寫遞歸的解法
新航道雅思
轉載于:https://blog.51cto.com/zhangtaoze/1912835
總結
以上是生活随笔為你收集整理的leetcode面试准备:Decode Ways的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MacOS系统下的图形化工具
- 下一篇: HDU 3183 A Magic Lam