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; } };