Leetcode 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.
解题思路:
典型的dynamic programming
判断dp[i-1] , dp[i-2] 是否有效
recurrence formula: dp[i] += dp[i-1] if(s(i-1, i) is valid (1-9)) + dp[i-2] (if s(i-2, i)) is valid( 10-26))
base case: dp[0] =1, dp[1] = 1(s(0) is valid) or 0 (s(0) is not valid)
Java code:
public class Solution { public int numDecodings(String s) { if(s == null || s.length() == 0 || s.equals("0")){ return 0; } int[] dp = new int[s.length()+1]; //base case: dp[0] dp[1] dp[0] = 1; if(isValid(s.substring(0,1))){ dp[1] = 1; }else { dp[1] = 0; } for(int i = 2; i<= s.length(); i++){ if(isValid(s.substring(i-1, i))){ dp[i] += dp[i-1]; } if(isValid(s.substring(i-2,i))){ dp[i] += dp[i-2]; } } return dp[s.length()]; } public boolean isValid(String s){ if(s.charAt(0) == '0') { return false; } int value = Integer.parseInt(s); // Integer.parseInt: translate string to int return value >=1 && value <= 26; } }
Reference:
1. http://www.programcreek.com/2014/06/leetcode-decode-ways-java/
2. http://www.cnblogs.com/springfor/p/3896162.html