标签:com src void tco 思路 static ret img 不为
/*
91. 解码方法
一条包含字母 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) 。
解题思路:动态规划
一个数字,有多少种
代表比他少一个数字或者少两个数字加起来
f(n)=f(n-1)且n位不为0 + f(n-2)且n-1位和n位组成的数字在[10,26]
*/
public class p91 {
public static int numDecodings(String s) {
if(s.length()==0)return 0;
if(s.length()==1&&Integer.parseInt(s)>=1)return 1;
char arr[]=s.toCharArray();
if(arr[0]==‘0‘)return 0;//首字符为0怎么都无法解码
int dp[]=new int[s.length()];
dp[0]=1;
String ss= s.substring(0,2);
//System.out.println(ss);
if(Integer.parseInt(ss)>10&&Integer.parseInt(ss)<=26&&Integer.parseInt(ss)!=20)dp[1]=2;
else if(Integer.parseInt(ss)>26&&ss.charAt(1)==‘0‘){
dp[1]=0;//如30
}
else dp[1]=1;//如37情况
//System.out.println(dp[1]);
//System.out.println("----------");
for(int i=2;i<dp.length;i++){
if(arr[i]!=‘0‘){
dp[i]+=dp[i-1];
}
int num=(arr[i-1]-‘0‘)*10+(arr[i]-‘0‘);
//System.out.println(num);
//System.out.println("----------");
if(num>=10&&num<=26){
//System.out.println(num);
dp[i]+=dp[i-2];
}
}
return dp[s.length()-1];
}
public static void main(String[] args) {
System.out.println(numDecodings("301"));
char c=‘7‘;
//System.out.println("----------");
//System.out.println((int)c);
//System.out.println(c-‘0‘);
}
}
运行结果:

标签:com src void tco 思路 static ret img 不为
原文地址:https://www.cnblogs.com/jifeng0902/p/13254935.html