[LeetCode] 91. Decode Ways

来源:互联网 发布:布道者软件 编辑:程序博客网 时间:2024/06/05 20:30

[LeetCode] 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 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.


思路:用动规。
dp[i]表示从s[0:i]可以构造多少种code。
所以dp[i]分成三种状态:

  1. s[i] == ‘0’。
  2. s[i] == ‘1~6’。
  3. s[i] == ‘7~9’。

对于1、2的情况,我们考虑 s[i-1] == ‘1~2’,用以判断是否可以构成一个code。
对于3的情况,我们考虑s[i-1] == ‘1’,用以判断是否可以构成一个code。


class Solution {public:    int numDecodings(string s) {        int len = s.length();        vector<int> dp(len+1, 0);        for (int i=0; i<len; ++i) {            if (i == 0) {                if (s[i] == '0') return 0;                else dp[i] = 1;            } else {                if (s[i] == '0') {                    if (s[i-1] >= '1' && s[i-1] <= '2') {                        if (i-2 < 0) dp[i] = 1;                        else dp[i] = dp[i-2];                    } else {                        dp[i] = 0;                    }                } else if (s[i] <= '6') {                    if (s[i-1] >= '1' && s[i-1] <= '2') {                        if (i-2 < 0) dp[i] = dp[i-1] + 1;                        else dp[i] = dp[i-2] + dp[i-1];                    } else {                        dp[i] = dp[i-1];                    }                } else {                    if (s[i-1] == '1') {                        if (i-2 < 0) dp[i] = dp[i-1] + 1;                        else dp[i] = dp[i-2] + dp[i-1];                    } else {                        dp[i] = dp[i-1];                    }                }            }        }        return dp[len-1];    }};
0 0
原创粉丝点击