题目
题解
包含题目各种要求以及图表分析
其中大家要注意ss[i]表存的是字符,而dp[i]表存的是解码的方法数。
根据题目要求我们可以总结出题目的各个需要注意的点:
1.给出字符串s,将它转换成1-26的数字解码组合。
2.解码方式有单独解码和共同解码且只能和前一位**(i和i-1)**组合。
3.有1-26的范围限制,就说明有失败的组合;根据题目,0在前面就会出错,那么第一位不可能为0,否则就执行不起来。
4.单独解码代表单个数字,那么大小在1-9之间;组合解码代表两个数字组合,大小在10-26之间。
5.请计算并返回解码的方法总数:说明dp[i]:就代表到i位置时,解码方法的总数
完整代码
请注意我修改了传参的值,方便大家观看,大家可以自行修改。
class Solution {
public int numDecodings(String ss) {
//初始化
int n = ss.length();
char[] s = ss.toCharArray();
int[] dp = new int[n];
//处理边界情况
//初始化:第一个位置 i=0下标
if (s[0] != '0') dp[0] = 1;
if (n == 1) return dp[0];
//初始化:第二个位置 i=1下标
if (s[1] != '0' && s[0] != '0') dp[1] += 1;
int t = (s[0] - '0') * 10 + s[1] - '0';
if (t >= 10 && t <= 26) dp[1] += 1;
//初始化了0和1下标,从2下标开始
for(int i =2;i < n;i++) {
//单独解码情况
if(s[i] != '0') dp[i] += dp[i-1];
//组合解码情况
int tt = (s[i-1] - '0') *10 + s[i] - '0';
if (tt >= 10 && tt <= 26) dp[i] += dp[i - 2];
}
return dp[n-1];
}
}