示例 1:
输入:s = "12" 输出:2 解释:它可以解码为 "AB"(1 2)或者 "L"(12)。
示例 2:
输入:s = "226" 输出:3 解释:它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。
示例 3:
输入:s = "06"
输出:0
解释:"06" 无法映射到 "F" ,因为存在前导零("6" 和 "06" 并不等价)。
60也无法成功解码。
class Solution {
public:
int numDecodings(string s) {
int n=s.size();
vector<int> dp(n);
if(s[0]=='0') return 0;
dp[0]=s[0]!='0';
if(n==1) return dp[0];
if(s[0]!='0'&&s[1]!='0') dp[1]+=1;
int t = (s[0]-'0')*10+(s[1]-'0');
if(t>=10&&t<=26) dp[1]+=1;
for(int i=2;i<n;i++)
{
if(s[i]!='0') dp[i]+=dp[i-1];
int t = (s[i-1]-'0')*10+(s[i]-'0');
if(t>=10&&t<=26) dp[i]+=dp[i-2];
}
return dp[n-1];
}
};
优化:
class Solution {
public:
int numDecodings(string s) {
int n=s.size();
vector<int> dp(n+1);
dp[0]=1;
dp[1]=s[1-1]!='0';
for(int i=2;i<=n;i++)
{
if(s[i-1]!='0') dp[i]+=dp[i-1];
int t = (s[i-2]-'0')*10+(s[i-1]-'0');
if(t>=10&&t<=26) dp[i]+=dp[i-2];
}
return dp[n];
}
};