题目描述:
一条包含字母 A-Z 的消息通过以下方式进行了编码:
'A' -> 1
'B' -> 2
...
'Z' -> 26
给定一个只包含数字的非空字符串,请计算解码方法的总数。
示例 1:
输入: "12"
输出: 2
解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。
示例 2:
输入: "226"
输出: 3
解释: 它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。
思路:此题目采用从后向前解码的方式较为简单。申请n+1个空间的dp数组,dp[n]=1用于做初始化操作。此题的正确状态转移方程是
d
p
[
i
]
=
d
p
[
i
+
1
]
+
d
p
[
i
+
2
]
dp[i]=dp[i+1]+dp[i+2]
dp[i]=dp[i+1]+dp[i+2],
d
p
[
i
+
1
]
dp[i+1]
dp[i+1]表示
s
[
i
]
s[i]
s[i]单独进行解释,
d
p
[
i
+
2
]
dp[i+2]
dp[i+2]表示
s
[
i
]
和
s
[
i
+
1
]
s[i]和s[i+1]
s[i]和s[i+1]联合解释。这个题目不应该是这样的状态转移方程
d
p
[
i
]
=
{
d
p
[
i
+
1
]
i
f
s
[
i
]
+
s
[
i
+
1
]
>
26
d
p
[
i
+
1
]
+
1
i
f
s
[
i
]
+
s
[
i
+
1
]
<
=
26
dp[i]=\begin{cases} dp[i+1] & if s[i]+s[i+1]>26 \\ dp[i+1]+1 & if s[i]+s[i+1]<=26 \\ \end{cases}
dp[i]={dp[i+1]dp[i+1]+1ifs[i]+s[i+1]>26ifs[i]+s[i+1]<=26
因为无论如何
d
p
[
i
]
=
=
=
d
p
[
i
+
1
]
dp[i]===dp[i+1]
dp[i]===dp[i+1],是否等于
d
p
[
i
+
2
]
dp[i+2]
dp[i+2]则需要进行判断
class Solution {
public:
int numDecodings(string s) {
int len=s.size();
vector<int> dp(len+1);
dp[len]=1;//初始化
for(int i=len-1;i>=0;i--){
if(s[i]=='0')
dp[i]=0;//0无法单独作为一个数而且0也没有办法作为十位数
else{
dp[i]=dp[i+1];
if(i+2<=len&&((s[i]-'0')*10+(s[i+1]-'0')<=26))
dp[i]+=dp[i+2];
}
}
return dp[0];
}
};