Decode ways2

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) {
             //s为空 或者 s的第一个元素是'0' 都是不能decode的情况
             if (s.empty() || s.at(0) == '0'){
                 return 0;
             }
             // dp[i] means : pre-i element decoding ways
             // 这里的异常情况就是a[i] == 0的时候
             // dp[i] = dp[i - 1]  the i'th element is single decode (a[i] = 1~9 )
             // dp[i] = dp[i -1] + dp[i -2]; last two element for decoding (a[i-1][i] = 11~26)
             //这里的DP问题,是因为有一场情况,所以要考虑清楚
            
             int *dp = new int[s.size()];
             dp[0] = 1; //s.at(0) == '1'-->'9' 至少有一种方式
             //dp可以用0开始
             for(int i = 1; i < s.size(); i++){
                if (s.at(i) == '0'){ //i位置是'0'
                    if (s.at(i-1) == '1' || s.at(i-1) == '2'){
                        dp[i] = i > 1 ? dp[i -2] : 1;
                    }else{
                        return 0;
                    }
                }else{ //说明i位置是'1'到'9'
                    dp[i] = dp[i -1]; //至少当前i的为止可以decode
                    //这里也可以用乘积的方式确定
                    if (s.at(i-1) == '1' || s.at(i-1) == '2' && s.at(i) <= '6'){
                        dp[i] += i > 1 ? dp[i -2] : 1;
                    }
                }
             }
             int ans = dp[s.size() -1];
             delete []dp;
            return ans;
        }
 };

是否可以进行空间压缩呢?因为明显的i指依赖于i-1和i-2的位置

class Solution {
     public:
         int numDecodings(string s) {
             //s为空 或者 s的第一个元素是'0' 都是不能decode的情况
             if (s.empty() || s.at(0) == '0'){
                 return 0;
             }

             int p,p1,p2;
             p2 = p1 = p = 1;
             
             for(int i = 1; i < s.size(); i++){
                if (s.at(i) == '0'){ //i位置是'0'
                    if (s.at(i-1) == '1' || s.at(i-1) == '2'){
                        p = i > 1 ? p2 : 1;
                    }else{
                        return 0;
                    }
                }else{ //说明i位置是'1'到'9'
                    p = p1;
                    //这里也可以用乘积的方式确定
                    if (s.at(i-1) == '1' || s.at(i-1) == '2' && s.at(i) <= '6'){
                        p += i > 1 ? p2 : 1;
                    }
                }
                //变量往前面移
                p2 = p1;
                p1 = p;
             }

            return p;
     }
};

 

posted @ 2013-06-11 12:45  一只会思考的猪  阅读(150)  评论(0编辑  收藏  举报