LeetCode 91.解码方法
ways:
s[i] = 0 :
if(s[i-1] == 1 || s[i-1] == 2) :s[i]只能和前一位绑定在一起,此时dp[i] = dp[i-2];
else return 0 :无意义
s[i] != 0:
if(s[i-1] ==1 ) : s[i]能和s[i-1]组合也能拆开,dp[i] = dp[i-1]+dp[i-2];
else if(s[i-1] == 2 && s[i]<=6) : 也能组合,也能拆开,dp[i] = dp[i-1]+dp[i-2];
else : 不能组合,只能拆开,dp[i] = dp[i-1];
eg:
2 | 2 | 0 | 6 | 1 | 1 | |
---|---|---|---|---|---|---|
dp | 1 | 2 | 1 | 1 | 1 | 2 |
完整代码:
class Solution {
public:
int numDecodings(string s) {
vector<int> dp(s.size()+1 , 1); // 多定义dp的一个范围,防止第1(2)个元素访问dp[i-2]产生越界;
if(s[0] == '0')
return 0;
for(int i=1;i<s.size();i++)
{
if(s[i] == '0')
{
if(s[i-1] == '1' || s[i-1] == '2') // 只能和前面的数绑定在一起,唯一被译码
dp[i+1] = dp[i-1];
else
return 0;
}
else if(s[i-1] == '1' || (s[i-1] == '2' && s[i] <='6'))
dp[i+1] = dp[i] + dp[i-1]; // 能组合,也能拆开
else
dp[i+1] = dp[i]; // 只能拆开
}
return dp[s.size()];
}
};