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).

思路:用动态规划做。先考虑本位是不是0,如果是0:①如果前一位也是0,则不可破译,因为连续两位是0就肯定没有破译的方法。②如果前一位小于等于2,那么把前一位和本位作为一个整体,a[本位] = a[本为-2]. 3 .如果前一位大于2,则不可破译,因为30,40,以及以上没有对应的字母。

如果本为不是0 .那么考虑前一位是不是0.①如果前一位是0,那么划分的时候本为只能单独破译成一个字母,a[本位] = a[本位-1]。②如果前一位不是0. 那么考虑两种情况 一、前一位乘以10加上本位大于26,在这种情况下,本位不能与前一位相结合,那么a[本位] = a[本位-1] 二、前一位乘以10加上本位小于26.那么本位既可以与上一位结合 :a[本位-2],又可以单独破译 a[本为-1]

a[本位] = a[本位-2]+a[本位-1].

class Solution {
public:
    int numDecodings(string s) {
        int length = s.length();
        int a[length];
        if(length == 0)
            return 0;
        if(s[0]!='0')
           a[0] = 1;
        else
           return 0;
        if(length == 1)
            return 1;
        if(s[1] == '0')
        {
            if(s[0]-'0'<= 2)
                a[1] = 1;
            else
                return 0;
        }
        else
        {
          if(((s[0]-'0')*10+s[1]-'0')<=26)
              a[1] = 2;
            else
              a[1] = 1;
        }
    
        for(int i = 2; i <length ;i++)
        {
            if(s[i] == '0')
            {
            if((s[i-1]-'0'<=2)&&(s[i-1]!='0'))
                a[i] = a[i-2];
            else 
                return 0;
            }
            else 
            {
            if(((s[i-1]-'0')*10+(s[i]-'0') <= 26)&&s[i-1]!='0')
                a[i] = a[i-1] + a[i-2];
            else
                a[i] = a[i-1];
            }
           // cout<<i<<" "<<a[i]<<" "<<a[i-1]<<endl;
        }
        return a[length-1];
    }
};

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值