原题链接地址
传送门:https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/
题目原文
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
示例 1:
输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi”
提示:
0
<
=
n
u
m
<
2
31
0 <= num < 2^{31}
0<=num<231
题解
先把数字转为字符串(当然,对数字一位一位取余也行,但不建议)
解法一:深度优先搜索
搜索步长为1字符或2个两个字符,遍历有效的翻译方式。
private:
int ans = 0;
void dfs(string str,int start,int len){
if(start+len>str.size())return;//搜索长度超出字符长度
if(len==2 && str[start]=='0')return;//无效组合“0x”
int num = atoi(str.substr(start,len).c_str());//取值
if(num>25)return;//无对应字母
if(start+len==str.size()){//有效翻译
ans++;
return;
}
dfs(str,start+len,1);//搜索下一个字符
dfs(str,start+len,2);//搜索下两个字符
}
public:
int translateNum(int num) {
string str = to_string(num);
dfs(str,0,0);
return ans;
}
解法二:动态规划
i表示字符串的第i个字符(i从0开始),设定dp[i+2]表示到第i个字符为止的字符串的有效翻译方式数量。若翻译步长为1,即仅翻译第i个字符,那么翻译一定有效。若翻译步长为2,那么需要第i-1个和第i个字符的组合在“10”到“25”之间,才能翻译有效。所以能得到如下转移方程:
d
p
[
i
+
2
]
=
{
d
p
[
i
+
1
]
第
i
和
i
−
1
位
组
合
翻
译
无
效
d
p
[
i
+
1
]
+
d
p
[
i
]
o
t
h
e
r
s
dp[i+2]=\left\{\begin{matrix} dp[i+1] & 第i和i-1位组合翻译无效 \\ dp[i+1]+dp[i] &others \end{matrix}\right.
dp[i+2]={dp[i+1]dp[i+1]+dp[i]第i和i−1位组合翻译无效others
边界条件dp[0]=0,dp[1]=1。
public:
int translateNum(int num){
string str = to_string(num);
int dp[15];
memset(dp,0,sizeof(dp));
dp[1]=1;
for(int i = 0;i<str.size();i++){
dp[i+2]+=dp[i+1];
if(i==0)continue;
string pre = str.substr(i-1,2);
if(pre<="25" && pre>="10"){
dp[i+2]+=dp[i];
}
}
return dp[str.size()+1];
}
解法二优化
我们可以看见,动态规划,每一次转移状态的时候只需要知道当前字符的翻译数量,上一字符的翻译数量和上上一字符的翻译数量,即dp[i+2],dp[i+1]和dp[i]。所以可以将一维数组dp,节省为三个整型变量,减小空间复杂度。
public:
int translateNum(int num){
string str = to_string(num);
int preNum=0,prepreNum=0,curNum=1;
for(int i = 0;i<str.size();i++){
prepreNum = preNum;//更新上上一字符的翻译数量
preNum = curNum;//更新上一字符的翻译数量
curNum = 0;
curNum +=preNum;
if(i==0)continue;
string pre = str.substr(i-1,2);
if(pre<="25" && pre>="10"){
curNum+=prepreNum;
}
}
return curNum;
}
[1] https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/solution/