一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总数。
示例 1: 输入: "12" 输出: 2 解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。
示例 2: 输入: "226" 输出: 3 解释: 它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6)
class Solution {
public int numDecodings(String s) {
char[] str=s.toCharArray();
if(str[0]=='0'){
return 0;
}
return recur(str,0);
}
private int recur(char[] str,int index){
int result=0;
if(index==str.length){
return 1;
}
//不可能和后面的字符产生组合
if(str[index]=='0'){
return 0;
}
else if(str[index]>'2' && str[index]<='9'){
return recur(str,index+1);
}
else if(str[index]=='1'){
result+=recur(str,index+1);
if(index+1<str.length){
result+=recur(str,index+2);
}
}else{
result+=recur(str,index+1);
if(index+1<str.length && str[index+1]>='0' && str[index+1]<='6'){
result+=recur(str,index+2);
}
}
return result;
}
}
class Solution {
public int numDecodings(String s) {
char[] str=s.toCharArray();
if(str[0]=='0'){
return 0;
}
return recur(str,0);
}
private int recur(char[] str,int index){
int[] dp=new int[str.length+1];
int length=str.length;
dp[length]=1;
for(int i=length-1;i>-1;i--){
if(str[i]=='0'){
dp[i]=0;
}else if(str[i]>'2' && str[i]<='9'){
dp[i]=dp[i+1];
}else if(str[i]=='1'){
dp[i]=dp[i+1];
if(i+1<length){
dp[i]+=dp[i+2];
}
}else{
dp[i]=dp[i+1];
if(i+1<length && str[i+1]>='0' && str[i+1]<='6'){
dp[i]+=dp[i+2];
}
}
}
return dp[0];
}
}