描述
有一个消息包含A-Z
通过以下规则编码
'A' -> 1
'B' -> 2
...
'Z' -> 26
现在给你一个加密过后的消息,问有几种解码的方式
我们不能解码空串,因此若消息为空,你应该返回0。
消息的长度 n \leq 100n≤100
样例
样例 1:
输入: "12"
输出: 2
解释: 它可以被解码为 AB (1 2) 或 L (12).
样例 2:
输入: "10"
输出: 1
思路 :这一道中等难度的动态规划题目,递推公式比较容易判断,最后一项的解密可能是1位数和2位数,所以f(i)=f(i-1)+f(i-2),唯一不好判断是含0的情况 ,需要仔细。
1.第i项是二位数时,满足10-26:
(个位不为0)f(i)=f(i-1)+f(i-2)
(个位为0)f(i)=f(i-2)
2.第i项为一位数时
(不为0) f(i)=f(i-1)
(为0) f(i)=0
3.其他情况
f(i) =0;
public class Solution {
/**
* @param s: a string, encoded message
* @return: an integer, the number of ways decoding
*/
public int numDecodings(String s) {
// write your code here
if(s.length()==0) return 0;
int[] dp = new int[s.length()];
if(s.charAt(0)!='0') dp[0] =1;
for(int i=1;i<s.length();i++){
if(i==1){
int n = Integer.valueOf(s.substring(i-1,i+1));
if(n>=10&&n<=26) if(s.charAt(i)!='0')dp[i] = 2;else dp[i] = 1;
else if(s.charAt(i)!='0') dp[i] = 1;
else dp[i] = 0;
}else{
int n = Integer.valueOf(s.substring(i-1,i+1));
if(n>=10&&n<=26) if(s.charAt(i)!='0')dp[i] = dp[i-1]+dp[i-2];else dp[i] = dp[i-2];
else if(s.charAt(i)!='0') dp[i] = dp[i-1];
else dp[i] = 0;
}
}
return dp[s.length()-1];
}
}