思路:
● 动态规划 的第一步即为 确定状态,记dp[i] 为到第i+1位时的解码方法总数
● 最后一步 : 最后通过递推即可得到dp[s.length()] 即为结果
● 边界处理: 初始化dp[0]=1,dp[1] 可由dp[0]推导
注意:
- 此题求解的是解码的方法数,当我们到i位时,如果是直接解码当前i位的数作为1次解码的方法时,实际上和之前的解码方式等价,无需再对解码总数加一
- 注意处理前面为前导零的情况
class Solution {
public int numDecodings(String s) {
int[] dp=new int[s.length()+1];
/**
dp[i] 表示到第i个时解码的种数,注意单个解码的方式,视为1种
*/
dp[0]=1;// 初始化为1
for(int i=1;i<=s.length();i++){
if(s.charAt(i-1)!='0'){
dp[i]=dp[i-1];// 当前数不为0,相当于和之前的解码数一样,因为每次解码一次的方法是相同的
}
// 和前一个组合会使得当前数增加,组合的数小于26增加
if(i>1&&(s.charAt(i-2)-'0'>0&&((s.charAt(i-1)-'0')+(s.charAt(i-2)-'0')*10)<=26 )){
dp[i]+=dp[i-2];//加上截至到前两次的方法,注意无需加一,和截至前两次的的个数相同
}
}
return dp[s.length()];
}
}