Leetcode典型题解答和分析、归纳和汇总——T91(解码方法)

题目描述:

一条包含字母A-Z的消息通过以下方式进行了编码:

Leetcode典型题解答和分析、归纳和汇总——T91(解码方法)_第1张图片

给定一个只包含数字的非空字符串,请计算解码方法的总数

Leetcode典型题解答和分析、归纳和汇总——T91(解码方法)_第2张图片

问题解析:

本题可以采用数据拆分(最多拆成两位数),然后依次进行重组,最后计算出结果总数进行返回。可以采用动态规划方式进行求解,关键在于如何利用N+1、N、N-1之间的个数关系。

在进行数字切片的过程中,我们先假设一个数字集合(....,1,2),且dp[i-2]=a,dp[i-1]=b,那么当加入一个数据1时,数据组变成了(...,1,2,1),此时数字“1”可以单独解码,于是种类为dp[i-1],同时也可以与2结合变成“21”,此时种类为dp[i-2],最多也就是与前面一位数结合,于是所有的可能情况为dp[i]=dp[i-1]+dp[i-2]。这个做法其实与楼梯阶数的走法类似,可以走一节台阶,也可以是两节,于是可以求解出状态转移方程,最后考虑一些约束:(1)当数组中是数字0开头的时候,是不能解码的,因为0不在键值对的范围内。(2)当前一个数字是2时,则当下的数字必须在0~6之间,否则无法组合。

class Solution {
public:
    int numDecodings(string s) {
       if(s[0]=='0') return 0;  //首个数字为0,则不能解码
       int pre =1,cur=1;

       for(int i=1;i= '1' && s[i] <= '6'))
           cur = cur+pre;  //采用动态规划
           pre = tmp;
       }

       return cur;
    }
};

 

 

 

 

你可能感兴趣的:(工程项目实践,算法,数据结构,学习资料总结)