leetcode 解码方法 中等
dp[i] 表示 s 前 i 个可以构成的方案数。
如果 s[i] == '0' 那么他的上一位只能是 '1' 或者 '2',此时 dp[i] += dp[i - 2];
如果 s[i] != '0' 那么他首先可以自成以为,即 dp[i] += dp[i -1],如果他与上一位构成的数是 11 ~ 26,那么 dp[i] += dp[i - 2]
class Solution { public: int numDecodings(const string &s) { // dp[i] 表示 s 中前 i 个的方案数 vector<int> dp(s.size() + 1, 0); dp[0] = 1; for(int i = 1; i <= s.size(); ++ i) { if(s[i - 1] == '0') { if(i > 1 && s[i - 2] >= '1' && s[i - 2] <= '2') dp[i] += dp[i - 2]; } else { dp[i] += dp[i - 1]; if(i > 1 && (s[i - 2] == '1' || (s[i - 2] == '2' && s[i - 1] <= '6'))) { dp[i] += dp[i - 2]; } } } return dp.back(); } };