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 a non-empty string containing only digits, determine the total number of ways to decode it.
Example 1:
Input: "12" Output: 2 Explanation: It could be decoded as "AB" (1 2) or "L" (12).
Example 2:
Input: "226" Output: 3 Explanation: It could be decoded as "BZ" (2 26), "VF" (22 6), or "BBF" (2 2 6).
思路:我最开始的思路是从后往前,同时考虑到最大组合是1~26,所以只需要比较该元素和后一个元素可以不可以组合,若可以f(n)=f(n+1)+f(n+2) 若不可以,f(n)=f(n+1),为了方便所以定义了一个n+1的数组,且n+1元素为1,其他为0。。
但是需要注意的是每一次都仍要判别当前元素是不是为0,之前没有判断导致溢出!
当然也可以从前往后去想。并且对第一和第二个元素都设为1,把当前可以组合的数字保存在cnt[n+1]的位置
class Solution {
public:
int numDecodings(string s) {
int sSize=s.size();
if(sSize<0||s[0]=='0')
return 0;
vector<int>dp(sSize+1,0);
dp[sSize]=1;
if(s[sSize-1]-'0'<=9&&s[sSize-1]-'0'>0)
dp[sSize-1]=1;
for(int i=sSize-2;i>=0;i--)
{
if(s[i]=='0')
continue;
int temp=(s[i]-'0')*10+(s[i+1]-'0');
if(temp>0&&temp<=26)
{
dp[i]=dp[i+1]+dp[i+2];
}
else
{
dp[i]=dp[i+1];
}
}
return dp[0];
}
};
class Solution {
public:
int numDecodings(string s) {
int m = s.length();
if (m == 0) return 0;
if (s[0] == '0') return 0;
vector<int> cnt(m + 1, 0);
cnt[0] = 1;
cnt[1] = 1;
for (int i = 1; i < m; ++i) {
// check if 0 is the valid num
if (s[i] == '0') {
if (!is_valid_num(s[i - 1], s[i])) return 0;
else cnt[i + 1] = cnt[i - 1];
} else {
cnt[i + 1] += cnt[i];
if (is_valid_num(s[i - 1], s[i])) cnt[i + 1] += cnt[i - 1];
}
}
return cnt[m];
}
private:
bool is_valid_num(char& a, char& b) {
if (a == '1' || a == '2' && b < '7') return true;
return false;
}
};