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.
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 class Solution {
/**
* @param s a string, encoded message
* @return an integer, the number of ways decoding
*/
public int numDecodings(String s) {
if(s.length() == 0) return 0;
else return helper(s);
}
private int helper(String s) {
//add 1 at the end
if(s.length() == 0) return 1;
if(s.length() == 1 && Integer.parseInt(s.substring(0, 1)) != 0) return 1;
int res = 0;
if(Integer.parseInt(s.substring(0, 1)) == 0) return 0;
else {
int tmp = Integer.parseInt(s.substring(0, 2));
int count = 0;
if(tmp <= 26) {
count = helper(s.substring(2));
}
return helper(s.substring(1)) + count;
}
}
}
结果超时。只能使用一维数组。虽然原理相同,但是一维数组用加法代替了递归的步骤,所以更加快速
public class Solution {
/**
* @param s a string, encoded message
* @return an integer, the number of ways decoding
*/
public int numDecodings(String s) {
if(s.length() == 0 || s == null) return 0;
if(s.charAt(0) == '0') return 0;
int[] res = new int[s.length() + 1];
//start from 1, keep two elements before cursor because if we get 31 in i position, we need i-2 value
res[0] = 1;
res[1] = 1;
for(int i = 2; i <= s.length(); i++) {
if(s.charAt(i - 1) > '0' && s.charAt(i - 1) <= '9') res[i] = res[i - 1];
int tmp = Integer.parseInt(s.substring(i - 2, i));
if(s.charAt(i - 2) != '0') {
if(tmp > 0 && tmp <= 26){
res[i] += res[i - 2];
}
}
}
return res[s.length()];
}
}