leetcode : 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.

明显的动态规划题,比较坑爹的是这些数字中是可以出现0的,当出现的时候它前面的数字必须是1或者2.

以dp[i]表示前i个数字的转换数目,我们可以得到状态转移公式

若s[i -1] == '0'  则如果0 前面的数字是1 或者 2的话,dp[i] = dp[i-2],  否则数字串非法,返回0

若s[i - 1] != '0'  则如果最后两个数字是合法的,dp[i] = dp[i-1] + dp[i-2] 否则dp[i] = dp[i-1]

AC代码:

class Solution {
public:
    int numDecodings(string s) {
        vector<int> dp(s.size() + 1, 0);
        if(s[0] == '0' || s.size() == 0)
            return 0;
        dp[0] = dp[1] = 1;
        for(int i = 2; i <= s.size(); ++i){
            if(s[i - 1] == '0'){
                if(s[i - 2] == '2' || s[i - 2] == '1')
                    dp[i] = dp[i - 2];
                else
                    return 0;
            }else
               dp[i] = dp[i - 1] + (valid(s,i - 2,2) ? dp[i - 2] : 0);
        }
        return dp[s.size()];
    }
    bool valid(string s, int start, int n){
        if(s[start] == '0')
            return false;
        string str = s.substr(start,n);
        stringstream ss(str);
        int num;
        ss>>num;
        if(num <= 26 && n >= 1)
            return true;
        else
            return false;
    }
};

 

posted on 2014-11-25 09:24  远近闻名的学渣  阅读(162)  评论(0)    收藏  举报

导航