. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/decode-ways/description/
示例 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];}
};