首页 > 其他 > 详细

leetcode 91. 解码方法

时间:2019-11-19 18:48:42      阅读:74      评论:0      收藏:0      [点我收藏+]

91. 解码方法

问题描述

一条包含字母?A-Z 的消息通过以下方式进行了编码:
'A' -> 1
'B' -> 2
...
'Z' -> 26
给定一个只包含数字的非空字符串,请计算解码方法的总数。
示例 1:
输入: "12"
输出: 2
解释:?它可以解码为 "AB"(1 2)或者 "L"(12)。
示例?2:
输入: "226"
输出: 3
解释:?它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。

问题分析

如果字符串长度为0或者开头为0,则肯定无法解码,返回0,所以之后开头肯定大于0,所以开头第一个元素已经考虑了,只有一个解码方式,初始化cur=1与pre=1,然后从第二个元素开始遍历:

  • 1.遇到s[i]元素为0,考虑之前元素s[i-1]:
    • 1.1 若s[i-1] = 1 或s[i-1] = 2,则只有一种编码方式,所以编码方式总数不变,cur = pre;
    • 1.2 否则是非法编码;
  • 2.如果s[i-1] = 1 或者 (s[i-1] = 2 && s[i] < 7),这时可以两种编码方式(以s[i-1]s[i]一起解码或s[i]单独解码),cur += pre;否则只有s[i]单独解码,cur不变

    代码

class Solution {
public:
    int numDecodings(string s) {
        int n = s.size();
        if(n == 0) return 0;
        if(s[0] == '0')return 0;//之后s[0]>=1
        int i,ans = 0;
        int cur = 1,pre = 1,tmp;//在第i步,实际cur = dp[i+1],pre = d[i-1],tmp = dp[i]
        for(i = 1; i < n; i++)
        {
            tmp = cur;//因为cur将被覆盖
            if(s[i] == '0')
            {
                if(s[i-1] == '1' || s[i-1] == '2')
                    cur = pre;
                else
                    return 0;
            }
            else if(s[i-1] == '1' || (s[i-1] == '2' && s[i] < '7'))
                cur += pre;
            pre = tmp;  
            
        }
        return cur;
    }
};

leetcode 91. 解码方法

原文:https://www.cnblogs.com/qujingtongxiao/p/11889557.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!