Medium
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.
FB的高频题,老师以climbing stairs引出来的,会了就比较简单。有几个地方要注意以下:
- 方便表达,用dp[i]表示到达所给串的第i个字符时,一共有的decode的方法, dp[0]表达的是字符串是空的时候可以decode的方法数(1种而不是0种),而不是达到s.charAt(0)时候的方法数
- 判断s.charAt(0) == 0?, 如果等于,其实是不可能出现的情况,方法数为零,也可以直接返回0了。
- for循环从i = 2开始,因为我们从dp[2]开始求。 dp[2]表达的是到达第二个字符串一共能decode的方法总数。那么我们就需要看当前字符串构成的一位数和前一个字符串加上当前字符串构成的二位数即s[1], s[0,1], 也就是s.substring(i - 1, i)和s.substring(i - 2, i), 分别看前者是不是在[1, 9]范围里,后者是不是在[10,26]范围里,如果是,就dp[i] += dp[i - 1]或dp[i] += dp[i - 2].
class Solution {
public int numDecodings(String s) {
if (s == null || s.length() == 0){
return 0;
}
int n = s.length();
int[] dp = new int[n + 1];
dp[0] = 1;
dp[1] = s.charAt(0) == '0' ? 0 : 1;
for (int i = 2; i <= s.length(); i++){
int prevOne = Integer.valueOf(s.substring(i - 1, i));
int prevTwo = Integer.valueOf(s.substring(i - 2, i));
if (prevOne > 0 && prevOne <= 9){
dp[i] += dp[i - 1];
}
if (prevTwo >= 10 && prevTwo <= 26){
dp[i] += dp[i - 2];
}
}
return dp[n];
}
}