Decode Ways

91. Decode Ways

 

A message containing letters from A-Z is being encoded to numbers using the following mapping:

'A' -> 1
'B' -> 2
...
'Z' -> 26

Given a non-empty string containing only digits, determine the total number of ways to decode it.

Example 1:

Input: "12"
Output: 2
Explanation: It could be decoded as "AB" (1 2) or "L" (12).

Example 2:

Input: "226"
Output: 3
Explanation: It could be decoded as "BZ" (2 26), "VF" (22 6), or "BBF" (2 2 6).

 

思路:我最开始的思路是从后往前,同时考虑到最大组合是1~26,所以只需要比较该元素和后一个元素可以不可以组合,若可以f(n)=f(n+1)+f(n+2)  若不可以,f(n)=f(n+1),为了方便所以定义了一个n+1的数组,且n+1元素为1,其他为0。。
但是需要注意的是每一次都仍要判别当前元素是不是为0,之前没有判断导致溢出!
当然也可以从前往后去想。并且对第一和第二个元素都设为1,把当前可以组合的数字保存在cnt[n+1]的位置

 

class Solution {
public:
    int numDecodings(string s) {
        int sSize=s.size();
        if(sSize<0||s[0]=='0')
            return 0;
        vector<int>dp(sSize+1,0);
        dp[sSize]=1;
        if(s[sSize-1]-'0'<=9&&s[sSize-1]-'0'>0)
            dp[sSize-1]=1;
       
     
        for(int i=sSize-2;i>=0;i--)
        {
            if(s[i]=='0')
                continue;
            int temp=(s[i]-'0')*10+(s[i+1]-'0');
            if(temp>0&&temp<=26)
            {
                dp[i]=dp[i+1]+dp[i+2];
            }
            else
            {
                dp[i]=dp[i+1];
            }
            
            
        }
        return dp[0];
    }
};

 

 

class Solution {
public:
    int numDecodings(string s) {
        int m = s.length();
        if (m == 0) return 0;
        if (s[0] == '0') return 0;
        vector<int> cnt(m + 1, 0);
        cnt[0] = 1;
        cnt[1] = 1;
        for (int i = 1; i < m; ++i) {
            // check if 0 is the valid num
            if (s[i] == '0') {
                if (!is_valid_num(s[i - 1], s[i])) return 0;
                else cnt[i + 1] = cnt[i - 1];
            } else {
                cnt[i + 1] += cnt[i];
                if (is_valid_num(s[i - 1], s[i])) cnt[i + 1] += cnt[i - 1];
            }
        }
        return cnt[m];
    }
private:
    bool is_valid_num(char& a, char& b) {
        if (a == '1' || a == '2' && b < '7') return true;
        return false;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值