1,题目要求
A message containing letters from A-Z is being encoded to numbers using the following mapping:
'A' -> 1
'B' -> 2
...
'Z' -> 26
Given a non-empty string containing only digits, determine the total number of ways to decode it.
Example 1:
Input: “12”
Output: 2
Explanation: It could be decoded as “AB” (1 2) or “L” (12).
Example 2:
Input: “226”
Output: 3
Explanation: It could be decoded as “BZ” (2 26), “VF” (22 6), or “BBF” (2 2 6).
使用以下映射将包含来自A-Z的字母的消息编码为数字:
'A' -> 1
'B' -> 2
...
'Z' -> 26
给定仅包含数字的非空字符串,确定解码它的方法总数。
2,题目思路
对于这道题,要求将一个仅包含数字的字符串转确定其可以解码的总的方法数。
字符的解码如题目所要求的那样,即让1~26分别代表26个字母。
给定一串数字,首先我们可以知道,0不能解码成字符,1~9则是可以解码成对应的字母;
对于两位的数字,10~26可以解码成对应的字母,超过26则就不能解码了。
对此,我们可以利用动态规划的思路,定义dp,其中dp[i]表示从开始位置长度为i的字符串,所能解码的种类数。
dp [0]表示空字符串将有一种解码方式,dp [1]表示解码大小为1的字符串的方法。检查一位数和两位数组合并保存结果。
最后,dp[n]所保存的,就是最终的结果。
3,代码实现
static auto speedup = [](){
ios::sync_with_stdio(false);
cin.tie(nullptr);
return nullptr;
}();
class Solution {
public:
int numDecodings(string s) {
if(s.size() == 0)
return 0;
int n = s.size();
vector<int> dp (n+1, 0);
//dp[0]表示空字符串将有一种解码方式,
//dp [1]表示解码大小为1的字符串的方法。
dp[0] = 1;
dp[1] = s[0] != '0'? 1 : 0;
for(int i = 2;i<=n;i++){
int singleLen = stoi(s.substr(i-1,1));
int doubleLen = stoi(s.substr(i-2,2));
//说明single是单词
if(singleLen>=1 && singleLen<=9)
dp[i] += dp[i-1];
//说明double是单词
if(doubleLen>=10 && doubleLen<=26)
dp[i] += dp[i-2];
}
return dp[n];
}
};