题目:
把数字翻译成字符串
Category | Difficulty | Likes | Dislikes |
---|---|---|---|
lcof | Medium (52.26%) | 453 | - |
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
示例 1:
输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
提示:
0 <= num < 231
知识点:
动态规划
分析:
str[] | str[0] | str[1] | str[2] | str[3] | str[4] | ... | str[n-1] | |
num[] | 1 | 2 | 2 | 5 | 8 | ... | ||
dp[] | dp[0]=1 | dp[1]=1 | dp[2]= | dp[3]= | dp[4]= | dp[5]= | ... | dp[n] |
动态规划步骤:
1、满足无后性:与前面状态有关,长度N与种数有关,长度N的字符种数与N-1的状态有关(能否组成一个字符)。
2、中间数组状态:种数与长度一个变量有关,dp为一维数组
3、递推方程式:见代码分析
4、边界:见代码分析
代码:
/*
* @lc app=leetcode.cn id=100325 lang=cpp
*
* [剑指 Offer 46] 把数字翻译成字符串
*/
// @lc code=start
/* 分析
1、第n个字符的种数与第n-1个字符种数有关(大于或小于25)
2、种数只与长度有关,dp为一维数组
3、决定状态(递推公式):
n-1与n > 25: dp[i] = dp[i-1],只能组成两个字母
n-1与n <= 25: dp[i] = dp[i-1] + dp[i-2],能组成单个字母和两个字母
4、边界:dp[0] = 1, dp[1] = 1;
*/
class Solution {
public:
int translateNum(int num) {
if(num < 0 ) return 0;
if(num < 10) return 1;
string str(to_string(num));
vector<int> dp(str.length()+1);
//初始化边界条件
dp[0] = 1;
dp[1] = 1;
//递推计算
for(int i=2; i < dp.size(); i++){
int j = str[i-1]-'0' + (str[i-2]-'0') *10;
if(j <= 25 && j >= 10){
//两位可组成字符
dp[i] = dp[i-1] + dp[i-2];
}else {
dp[i] = dp[i-1];
}
}
return dp[str.length()];
}
};
// @lc code=end
结果:
Accepted
- 49/49 cases passed (0 ms)
- Your runtime beats 100 % of cpp submissions
- Your memory usage beats 92.74 % of cpp submissions (5.7 MB)
注意:
506,只能组成 "fag",种数1