標籤:style blog http color io for ar div
Decode Ways
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.
演算法思路:
思路1:遞迴。典型的遞迴演算法,不用試就知道會逾時。
思路2:dp。既然遞迴逾時,那就不妨試試dp了。
維護一個一維數組,dp[length]。dp[i]表示字串 i ~ length的decode ways。
初始狀態:dp[length] = 0; dp[length - 1] = dp[length - 1] = s.charAt(length - 1) == ‘0‘ ? 0 : 1;
每次讀取num = s.substring(i,i + 2)
如果大於26,則dp[i] = dp[i + 1];
如果小於等於26,則dp[i] = dp[i + 1] + dp[i + 2];
【注意】0的處理,第一遍未通過case“0”,"01","101"
1 public class Solution { 2 public int numDecodings(String s) { 3 if(s.length() == 0) return 0; 4 int length = s.length(); 5 int[] dp = new int[length + 1]; 6 dp[length] = 1; 7 dp[length - 1] = s.charAt(length - 1) == ‘0‘ ? 0 : 1; 8 for(int i = length - 2; i >= 0; i--){ 9 if(s.charAt(i) == ‘0‘) continue;10 int tem = Integer.valueOf(s.substring(i,i + 2));11 if(tem > 26){12 dp[i] = dp[i + 1];13 }else{14 dp[i] = dp[i + 1] + dp[i + 2];15 }16 }17 return dp[0];18 }19 }