Description:
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.
Ex:
Given encoded message “12”, it could be decoded as “AB” (1 2) or “L” (12).
The number of ways decoding “12” is 2.
问题描述:
解码方式,26个字母的映射表已经给出了,现在给一串包含数字的编码后的字符串,问有多少种解码方式。
比如给编码信息”12”,既可以译码为ab又可以译码为l,所以共有2种译码方式。
解法一:
思路:
对一串数字而言,要么提取一位,要么提取两位(有效字符),所以该问题可以用动态规划解决,初始化dp[n+1]的数组和dp[0]、dp[1],然后开始遍历,
如果提取的一位数字(first)合法,则dp[i] += dp[i-1];
如果提取的两位数字合法,则dp[i] += dp[i-2];
最后返回dp[n]
这个问题其实和原先的凑硬币问题是有点像的,只不过这里是编码方式,无需+1(凑硬币问题求的是硬币数量)
Code:
public 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' ? 1 : 0;
for(int i = 2; i <= n; i++){
int first = Integer.valueOf(s.substring(i-1,i));
int second = Integer.valueOf(s.substring(i-2,i));
if(first >= 1 && first <= 9){
dp[i] += dp[i-1];
}
if(second >= 10 && second <= 26){
dp[i] += dp[i-2];
}
}
return dp[n];
}
}