Appearance
46-把数字翻译成字符串
题目描述
https://leetcode.cn/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 < 2^{31} $$
思路1 动态规划
基本思路: 动态规划 按照字符串,1位时候编码,2位时的编码,位数增加后的编码计算
小青蛙跳楼梯的变种
1位数 一种编法
2位数 两种编法,一种是1位+1位,另外一种是两位一起编,不过要判断,要大于等于10,小于等于25,否则无效
3位数 就是 1位数的编法(加两位:需判断) + 2位数的编法+1位
以此类推
实现代码
csharp
public class Solution {
//基本思路: 动态规划 按照字符串,1位时候编码,2位时的编码,位数增加后的编码计算
// 小青蛙跳楼梯的变种
// 1位数 一种编法
// 2位数 两种编法,一种是1位+1位,另外一种是两位一起编,不过要判断,要大于等于10,小于等于25,否则无效
// 3位数 就是 1位数的编法(加两位:需判断) + 2位数的编法+1位
// 以此类推
public int TranslateNum(int num) {
char[] str = num.ToString().ToCharArray();;
int[] dp = new int[str.Length+1];
dp[0] = 1; // 只有一位的时候,只能有一种编码方式
dp[1] = 1;
int maxCount = 1;
for(int i=2; i < str.Length+1; i++){
//当前位直接编码,那么和前一种编码算同一个放置,只有联合前面一位的二位编码,才有可能是新编码
//且如果两位数 > 25 了,那就不能编码,最大是 25 -> z
int number = Convert.ToInt32(str[i-2].ToString() + str[i-1].ToString()) ;
if(number <= 25 && number >= 10){
dp[i] = dp[i-1]+dp[i-2];
}
else{
dp[i] = dp[i-1];
}
if(dp[i] > maxCount){
maxCount = dp[i];
}
}
return maxCount;
}
}
复习重写代码
csharp
public class Solution {
public int TranslateNum(int num) {
//动态规划
// dp[i] 表示前面i位能够编码的方式数
string str = num.ToString();
int n = str.Length;
int[] dp = new int[n+1];
dp[0] = 1; //前面0位只有一种方式
dp[1] = 1; //前面1位也只有一种编码方式
int max = 1;
for(int i=2; i<=n; i++){
int preNum = Convert.ToInt32(str[i-2].ToString() + str[i-1].ToString());
//根据题意如果大于 25的无法编第二种码, 直接 0几 也不算第二种编码,所以 preNum >=10 && preNum <=20 才有可能第二种编码
if(preNum >=10 && preNum <=25){
dp[i] = dp[i-2] + dp[i-1];
}
else{
dp[i] = dp[i-1];
}
max = Math.Max(dp[i],max);
}
return max;
}
}
思路2 递归解法,深度遍历
csharp
public class Solution{
private int dfs(int num){
if(num < 10){
return 1;
}
if(num % 100 <= 25 && num %100 >=10){
//如果余数在10到25之间,那么说明编码可以分为两部分
//1. 数字除以100的后前面数字的编法 + 这个10~25的编码
//2. 数字除以10的编法+最后一位数的编码
//递归处理剩余的部分
return dfs(num / 10) + dfs(num / 100);
}
else{
return dfs(num / 10);
}
}
public int TranslateNum(int num){
if(num == 0){
return 1;
}
return dfs(num);
}
}
复习:递归 20220508
csharp
public class Solution {
private int dfs(int num){
//从后往前编码
if(num<10){
return 1;
}
if(num % 100 >= 10 && num %100 <=25){
return dfs(num / 100) + dfs(num / 10);
}
else{
return dfs(num / 10);
}
}
public int TranslateNum(int num) {
return dfs(num);
}
}
AlgoPress