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
Given encoded message
"12"
, it could be decoded as "AB"
(1 2) or "L"
(12).
The number of ways decoding
Code (Java):"12"
is 2.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | public class Solution { public int numDecodings(String s) { if (s == null || s.length() == 0 ) { return 0 ; } int [] dp = new int [s.length()]; if (s.charAt( 0 ) >= '1' && s.charAt( 0 ) <= '9' ) { dp[ 0 ] = 1 ; } else { return 0 ; } if (s.length() <= 1 ) { return 1 ; } // Initialize dp[1] if (s.charAt( 1 ) >= '1' && s.charAt( 1 ) <= '9' ) { dp[ 1 ] = 1 ; } if (isValid(s.substring( 0 , 2 ))) { dp[ 1 ] += 1 ; } for ( int i = 2 ; i < s.length(); i++) { if (s.charAt(i) >= '1' && s.charAt(i) <= '9' ) { dp[i] = dp[i - 1 ]; } if (isValid(s.substring(i - 1 , i + 1 ))) { dp[i] += dp[i - 2 ]; } } return dp[s.length() - 1 ]; } private boolean isValid(String str) { if (str.charAt( 0 ) == 0 ) { return false ; } int val = Integer.valueOf(str); if (val >= 10 && val <= 26 ) { return true ; } else { return false ; } } } |
Update on 2/8/16:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | public class Solution { public int numDecodings(String s) { if (s == null || s.length() == 0 ) { return 0 ; } if (s.charAt( 0 ) == '0' ) { return 0 ; } int [] dp = new int [s.length() + 1 ]; dp[ 0 ] = 1 ; dp[ 1 ] = 1 ; for ( int i = 2 ; i <= s.length(); i++) { if (s.charAt(i - 1 ) != '0' ) { dp[i] = dp[i - 1 ]; } if (isValid(s.substring(i - 2 , i))) { dp[i] += dp[i - 2 ]; } } return dp[s.length()]; } private boolean isValid(String s) { if (s.charAt( 0 ) == '0' ) { return false ; } int num = Integer.parseInt(s); if (num >= 1 && num <= 26 ) { return true ; } return false ; } } |