• 【编程题 动态规划】把数字翻译成字符串(详细注释 易懂)


    描述

    题目描述:把数字翻译成字符串_牛客题霸_牛客网 (nowcoder.com)

    有一种将字母编码成数字的方式:'a'->1, 'b->2', ... , 'z->26'。

    我们把一个字符串编码成一串数字,再考虑逆向编译成字符串。

    由于没有分隔符,数字编码成字母可能有多种编译结果,例如 11 既可以看做是两个 'a' 也可以看做是一个 'k' 。但 10 只可能是 'j' ,因为 0 不能编译成任何结果。

    现在给一串数字,返回有多少种可能的译码结果

    数据范围:字符串长度满足    0

    进阶:空间复杂度   O(n),时间复杂度   O(n)

    示例1

    输入:

    "12"

    返回值:

    2
    

    说明:

    2种可能的译码结果(”ab” 或”l”)     

    示例2

    输入:

    "31717126241541717"

    返回值:

    192
    

    说明:

    192种可能的译码结果     

    题目解读

         题目说,把一个字符串转成数字,现在让你把数字再转回字符串。 搁着反复横跳呢?! 

    但别信它鬼话,如果它给的数字都是字符串转来的,那我转回去,也应该都是字符串,不会出现异常结果,比如 0的前面不是 1 或者 2,导致无法译码,只能直接返回0 

    解题思想

        要想时间复杂度O(n)得出结果,还只能用动态规划,用循环,那肯定是双重循环。 动态规划 状态方程好写,但是对于 接触这个思想不多的同学,还是挺难理解的。这个题里面,如果当前数字无法与前面数字组合,比如 当前数字是7,8,9,前一位数字是 2,那它的可能性就是1,或者说 它不能让总的可能性增加。 再比如 前一位数字大于2 或者等于 0 ,那后一位数字无论是多少,都无法与前一位组合(因为这都大于30了,字母最大数字才26)。

          除了上面两种无法与前一位组合的,还有一种是必须与前面组合的,就是当前数字是0,那前一位必须是 1 或者2 ;当然,如果前一位不是1或者2 ,那就直接返回0(用例中有,所以我说它不是从字符串转来的)。  上面三种情况之外,其他情况都是,我可以自己 独当一面,也可以和别人搭伙过日子 。 也就是说,上面三种情况 ,都不会让总的可能性增加,所以 状态方程为 dp[ i ] = dp[ i-1] 。 而这三种情况以外的,可以让总的可能性增加,所以状态方程为 dp[ i ]= dp[ i-1 ]+dp[ i-2 ]  。  

    代码注释

        

    1. import java.util.*;
    2. public class Solution {
    3. /**
    4. * 解码
    5. * @param nums string字符串 数字串
    6. * @return int整型
    7. */
    8. public int solve (String nums) {
    9. // write code here
    10. int len = nums.length();
    11. // 如果长度为1,直接返回1,这里默认它不会只给一个0的情况
    12. if(len ==1)
    13. return 1;
    14. int[] dp = new int[len+1];
    15. dp[0]=1;
    16. dp[1]=1;
    17. // 因为三种特殊情况之外的情况,要考虑 dp[i-2]的值,所以从i=2 开始
    18. for(int i=2;i<= len;i++){
    19. // dp数组的下标比 nums数组下标 大一位 。 因为第一位的可能性固定,所以从
    20. // nums数组的第二位开始计算
    21. if(nums.charAt(i-1) == '0' ){
    22. if(nums.charAt(i-2)=='1'|| nums.charAt(i-2)=='2')
    23. dp[i] = dp[i-1];
    24. else{
    25. dp[i]=0;
    26. return 0;
    27. }
    28. }
    29. else if(( nums.charAt(i-2)=='2' && nums.charAt(i-1)>'6')
    30. ||(nums.charAt(i-2)>'2' || nums.charAt(i-2)=='0'))
    31. dp[i]= dp[i-1];
    32. else
    33. dp[i] = dp[i-1]+dp[i-2];
    34. }
    35. return dp[len];
    36. }
    37. }

  • 相关阅读:
    概率论几种易混淆的形式
    栈和队列(栈和队列的实现、两个队列实现栈、两个栈实现一个队列等经典例题)
    MySQL-事务
    知识图谱从入门到应用——知识图谱的获取与构建:知识工程与知识获取
    汽车融资租赁系统开发 | 互融云汽车融资租赁系统 实现全自动化流程管理
    基于pytorch使用特征图输出进行特征图可视化
    【Linux】环境变量
    linux如何部署前端项目和安装nginx
    分享一下蛋糕店在微信小程序上可以实现什么功能
    华为云安全亮相世界互联网大会
  • 原文地址:https://blog.csdn.net/qq_51901495/article/details/126448498