力扣-解码方法

11 阅读1分钟

题目

题解

包含题目各种要求以及图表分析

其中大家要注意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];
    }
}

代码解析