leetcode 91. 解码方法

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;
    }
};
posted @ 2019-11-19 17:54  曲径通霄  阅读(160)  评论(0编辑  收藏  举报