把数字翻译成字符串
题目
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。 0 < = n u m < 2 31 0 <= num < 2^{31} 0<=num<231
思路 动态规划
(1)25以内的数字可以进行组合,所以最多两位组合
(2)每次可以选择一个数字或两个数字用来合并成一个字符:
(3)如果上一个字符是0或合并后大于25,就无法组合成可转换的数字,即不能合成一个字符。
C++
class Solution {
public:
int translateNum(int num) {
string str = to_string(num);
int dp[11]; //num最大2^31,转换成str后有10位
dp[0]=1;
dp[1]=1;
for(int i=1; i< str.size(); ++i)
{
if(str[i-1]=='0' ||str.substr(i-1,2)>"25")
dp[i+1] = dp[i];
else
dp[i+1] = dp[i]+dp[i-1];
}
return dp[str.size()];
}
};
python
class Solution:
def translateNum(self, num: int) -> int:
numstr = str(num)
dp = [0]*11
dp[0] = 1
dp[1] = 1
for i in range(1, len(numstr)):
if numstr[i-1] == '0' or numstr[i-1:i+1]>'25':
dp[i+1] = dp[i]
else:
dp[i+1] = dp[i] + dp[i-1]
return dp[len(numstr)]