题目
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.
思路
本题题目和爬梯子很相似(每次只能爬一级或两级),这是个很典型的动态规划问题。我们维护一个数组dp[i]表示从索引i开始的字符串,转码的种类。那么我们可以写出状态转移方程:
dp[i] = Integer..parseInt(s.substring(i,i+2))<=26?dp[i+1]+dp[i+2]:dp[i+1]
代码
class Solution {
public int numDecodings(String s) {
int n = s.length();
if(n==0)
return 0;
int[] nums = new int[n+1];
nums[n] = 1;
nums[n-1] = s.charAt(n-1)=='0'?0:1;
for(int i=n-2;i>=0;i--)
{
if(s.charAt(i)=='0') continue;
nums[i] = Integer.parseInt(s.substring(i,i+2))<=26?nums[i+1]+nums[i+2]:nums[i+1];
}
return nums[0];
}
}