leetcode 91. Decode Ways
题目
A代表1 B代表2 C代表3 Z代表26
给你一个字符串如"12" 可以由 "AB" 也可以由“L”构成,求方案数
思路和代码
dp[i] 代表 到i-1为止有效的方案数
那么 dp[0] 必然=1, dp[1] 看 s[0] 是否为0
推广: 对于位置i, 如果 s[i-1]可以由A-Z代表, 那么 dp[i] += dp[i-1];
如果s[i-2] *10 + s[i-1] 可以由A-Z代表,那么dp[i] += dp[i-2];
class Solution {
public:
int numDecodings(string s) {
int len = s.size();
if(len == 0) return 0;
vector<int> dp(len+1, 0);
// dp[i] means (i-1) is valid
dp[0] = 1;
dp[1] = s[0] == '0' ? 0 : 1;
for(int i=2; i<=len; i++) {
int first = s[i-1] - '0';
int second = (s[i-2]-'0')*10 + s[i-1]-'0';
if(first > 0)
dp[i] += dp[i-1];
if(second >= 10 && second <= 26)
dp[i] += dp[i-2];
}
return dp[len];
}
};