91. 解码方法

题目描述

A message containing letters from A-Z is being encoded to numbers using the following mapping:
A -> 1
B -> 2
...
Z -> 26
Given an encoded message containing digits, determine the total number of ways to decode it.
For example,
Given encoded message"12", it could be decoded as"AB"(1 2) or"L"(12).The number of ways decoding"12"is 2.

方法1

需要使用内存的动态规划循环解决方案

class Solution {
public:
    int numDecodings(string s) 
    {
    	if(s.length()==0 || s[0] == '0')
    		return 0;
        int length = s.length();
        vector<int> dp(length+1,0);
        //为了递推的需要,人为的虚构的设置了一个长度为0
        //的情况,并根据递推公式,合理的初始化为1
        dp[0]= 1;
        dp[1] = 1;
        for(int len=2;len<=length;len++)
        {   
            //当前位自己能够单独解码的条件
            if(s[len-1]>='1' && s[len-1]<='9')
                dp[len] += dp[len-1];
            //当前位和前一位配合进行解码的条件
            if(s[len-2]=='1' || (s[len-2]=='2' && s[len-1]>='0' && s[len-1]<='6'))
                dp[len] += dp[len-2];
        }
        return dp[length];
    }
};

方法2

不使用辅助内存的,根据递推公式使用两个辅助变量的动态规划循环解决方案。

class Solution {
public:
    int numDecodings(string s) 
    {
    	if(s.length()==0 || s[0] == '0')
    		return 0;
        int length = s.length();
        int last1 = 1;
        int last2 = 1;
        for(int len=2;len<=length;len++)
        {   
	    int temp = 0;
            if(s[len-1]>='1' && s[len-1]<='9')
                temp += last2;
            if(s[len-2]=='1' || (s[len-2]=='2' && s[len-1]>='0' && s[len-1]<='6'))
                temp += last1;
            last1 = last2;
            last2 = temp;
        }
        return last2;
       
    }
};

posted on 2021-04-03 13:58  朴素贝叶斯  阅读(50)  评论(0编辑  收藏  举报

导航