题号:剑指 Offer 46
题目名:把数字翻译成字符串
原题URL: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 <= num < 231
思路
1.动态规划,i位置的拼凑方式是和i-1相关的,如果能和i-1位置合起来拼,那就是dp[i]=dp[i-1]+dp[i-2],否则就是他自己dp[i]=dp[i-1]
解题代码
class Solution {
public int translateNum(int num) {
//每个字符串有可能自己作为一种翻译,他也可能和前面一个字符形成联合翻译,动态规划解决
//dp[i]表示第i个位置有的翻译方式,可能是他自己一个翻译方式,也有可能是和前面一个字符凑成一种翻译方式
//状态转移方程为dp[i]=dp[i-1]或者dp[i]=dp[i-1]+dp[i-2]
List<Integer> list = new ArrayList<>();
while (num>0) {
list.add(0,num%10);
num/=10;
}
if(list.size()<=1) return 1;
int[] dp = new int[list.size()+1];
dp[0] = 1;
dp[1] = 1;
for (int i = 2; i < dp.length; i++) {
dp[i] = dp[i-1];
if(list.get(i-2)==1||(list.get(i-2)==2&&list.get(i-1)>=0&&list.get(i-1)<=5)) dp[i] += dp[i-2];
}
return dp[list.size()];
}
}