leetcode: Decode Ways

来源:互联网 发布:r语言mac安装教程 编辑:程序博客网 时间:2024/06/05 09:32

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.


本来是简单的斐波那契,这一变就变成动态规划加字符串处理了!!

class Solution {public:    int numDecodings(string s) {        if( s.size() == 0 || s[0] == '0')            return 0;        if( s.size() == 1)            return 1;        const int N = s.size();        vector< int> dp( N, 0);        dp[0] = 1;        int val = (s[0] - '0') * 10 + ( s[1] - '0');        if( val < 1 || val > 26){            if( val % 10 == 0)                return 0;            dp[1] = 1;        }        else if( val % 10 == 0){            dp[1] = 1;        }        else            dp[1] = 2;        for( int i = 2; i < N; ++i){            val = (s[i-1] - '0') * 10 + ( s[i] - '0');            if( val < 1){//连续两个0,无法解码                return 0;            }            else if( val < 10 || val > 26){                if( val % 10 == 0)//出现30,40....无法解码                    return 0;                dp[i] = dp[i-1];// 27,28,01,02解码方法数不变            }            else if(  val % 10 == 0){                if( s[i-2] > '0' && s[i-2] < '3')//720, 310                    dp[i] = --dp[i-1];                else//出现1010                    dp[i] = dp[i-1];            }            else{//正常情况                dp[i] = dp[i-2] + dp[i-1];            }        }        return dp[N-1];    }};

附上别人优雅的解法

class Solution {public:      int numDecodings(const string &s) {          if (s.empty() || s[0] == '0') return 0;int prev = 0;int cur = 1;// 长度为 n 的字符串,有 n+1 个阶梯for (size_t i = 1; i <= s.size(); ++i) {              if (s[i-1] == '0') cur = 0;              if (i < 2 || !(s[i - 2] == '1' ||                       (s[i - 2] == '2' && s[i - 1] <= '6')))prev = 0;              int tmp = cur;              cur = prev + cur;              prev = tmp;}return cur; }};



0 0