现有一串神秘的密文 ciphertext,经调查,密文的特点和规则如下:
密文由非负整数组成
数字 0-25 分别对应字母 a-z
请根据上述规则将密文 ciphertext 解密为字母,并返回共有多少种解密结果。
示例 1:
输入: ciphertext = 216612
输出: 6
解释: 216612 解密后有 6 种不同的形式,分别是 “cbggbc”,“vggbc”,“vggm”,“cbggm”,“cqgbc” 和 “cqgm”
动态规划
class Solution {
public:int crackNumber(int ciphertext) {std::string str = std::to_string(ciphertext);int n = str.size();vector<int> dp(n+1);dp[0] = 1;dp[1] = 1;for(int i = 2; i <= n; i++){char curNum = str[i-1], lastNum = str[i-2];if(curNum >= '0' && curNum <= '5'){if(lastNum == '1' || lastNum == '2'){dp[i] += dp[i-2];}dp[i] += dp[i-1];}else{if(lastNum == '1'){dp[i] += dp[i-2];}dp[i] += dp[i-1];}}return dp[n];}
};
时间复杂度: O(N)
空间复杂度: O(N)
这道题和将字母翻译为数字的逻辑一样,我们只需要定义dp[i]为前i个字符组成的字符串所能解密的字母个数。由于ciphertext是int类型,我们用to_string函数转化为string类型。然后我们开始遍历i,以第i个字符和第i-1个字符进行讨论,当curNum是0-5之间的时候,并且lastNum是1或2,我们可以将他们两个数字转化为一个字符。我们也可以将curNum自己转化为一个字母。
如果curNum是其他数字,那么只有当lastNum为1的时候,这两个数字才能转化为一个字母。或者我们也可以将curNum自己转化为一个字母。
最后返回dp[n]即可。