Java实现(这是个low13的尝试)
//该题为划分类动态规划.
//设数字串S前i个数字解密成字母串有f[i]种方式
//初始条件:f[0]=1,即空串中有一种方式解密-----解密成空串
//边界情况:如果i=1,只看最后一个数字
//计算顺序 f[0],f[1],f[2]......f[n]
//答案是f[n]
//时间复杂度O(n),空间复杂度O(n)
//状态:设数字串S前i个数字解密成字母串有f[i]种方式
//转移方程:f[i] = f[i-1]|S[i-1]对应一个字母 + f[i-2]|S[i-2]S[i-1]对应一个字母
//f[i] 数字串S前i个数字揭密成字母串的方式数
//f[i-1] 数字串S前i-1个数字揭密成字母串的方式数
//f[i-2] 数字串S前i-2个数字揭密成字母串的方式数
/*
对于视频p3中的 Decode Ways 即解码方式这道题,题目描述中写出了给定一个只包含数字的非空字符串,请计算解码方法的总数。所以不用考虑空串也就是n==0的情况.如果直接return 0 是否太过牵强?如果有测试用例的话可能会出错,而且后面f[0]初始化成了1,这样的话就更说不过去了,毕竟ppt中写道空串中有一种方式解密-----解密成空串
综上,不考虑n==0的情况,但f[0]还是要初始化为1 */
代码如下:还需改进
class Solution {
public static int numDecodings(String ss) {
char [] s = ss.toCharArray();
int n = s.length;
int [] f = new int[n+1];
f[0] = 1;
int i;
for(i = 1;i<=n;i++){
f[i] = 0;
int t = s[i-1] - '0';
if(t>=1 && t<=9){
f[i] += f[i-1];
}
if(i>=2){
t = (s[i-2]-'0')*10 + (s[i-1]-'0');
if(t>=10 && t<=26){
f[i] += f[i-2];
}
}
}
return f[n];
}
}