首页 > 其他分享 >【DP】LeetCode 91. 解码方法

【DP】LeetCode 91. 解码方法

时间:2023-04-23 09:34:19浏览次数:47  
标签:charAt int DP 数组 91 LeetCode dp

题目链接

91. 解码方法

思路

分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律

在数组的动态规划问题中,一般 dp[i] 都是表示以 nums 以前 i 个元素组成(即 nums[i - 1])的状态;dp[i][j] 分别表示以 nums1 前 i 个元素(即 nums1[i - 1])组成和以 nums2 前 j 个元素(即 nums2[j - 1])组成的状态,以此类推

字符串也是个数组,是字符数组

表示状态

状态表示就是靠猜,但是会有猜的套路,一般都是通过最终结果和数组数量来猜

这道题和【DP】LeetCode 剑指 Offer 46. 把数字翻译成字符串非常像,但是要复杂一些,原因是46题中0也能映射为一个字符,而本题中的0却是无效的,这就需要在解题中考虑前导0,而不能直接暴力的

找状态转移方程

思考的方向是:大问题的最优解怎么由小问题的最优解得到

边界处理

dp[0] = 1;
dp[1] = s.charAt(0) == '0' ? 0 : 1;

空间优化

因为 \(dp[i]\) 只和 \(dp[i - 1]\) 还有 \(dp[i - 2]\) 有关,所以可以用两个单变量 \(preDp1\) 和 \(preDp2\) 分别代表 \(dp[i - 1]\) 还有 \(dp[i - 2]\),在遍历过程中滚动更新

代码

dp数组版

class Solution {
    public int numDecodings(String s) {
        int n = s.length();
        if(n < 1){
            return 0;
        }

        int[] dp = new int[n + 1];
        dp[0] = 1;
        dp[1] = s.charAt(0) == '0' ? 0 : 1;

        for(int i = 2; i <= n; i++){
            int c = s.charAt(i - 1);
            int pre = s.charAt(i - 2);

            // s[i - 1] 能单独成字母
            if('1' <= c && c <= '9'){
                dp[i] += dp[i - 1];
            }
            // s[i - 1] 和 s[i - 2] 能组合成字母
            if(pre == '1' || (pre == '2' && c <= '6')){
                dp[i] += dp[i - 2];
            }
        }

        return dp[n];
    }
}

空间优化版

class Solution {
    public int numDecodings(String s) {
        int n = s.length();
        if(n < 1){
            return 0;
        }

        int preDp1 = 1;
        int preDp2 = s.charAt(0) == '0' ? 0 : 1;
        int current = 0;

        for(int i = 2; i <= n; i++){
            int c = s.charAt(i - 1);
            int pre = s.charAt(i - 2);

            // s[i - 1] 能单独成字母
            if('1' <= c && c <= '9'){
                current += preDp2;
            }
            // s[i - 1] 和 s[i - 2] 能组合成字母
            if(pre == '1' || (pre == '2' && c <= '6')){
                current += preDp1;
            }
            preDp1 = preDp2;
            preDp2 = current;
            current = 0;
        }

        return preDp2;
    }
}

标签:charAt,int,DP,数组,91,LeetCode,dp
From: https://www.cnblogs.com/shixuanliu/p/17345486.html

相关文章

  • leetcode_打卡11
    leetcode_打卡11题目:392.判断子序列代码:classSolution{publicbooleanisSubsequence(Strings,Stringt){intn=s.length(),m=t.length();inti=0,j=0;while(i<n&&j<m){if(s.charAt(i)==t.c......
  • #yyds干货盘点# LeetCode程序员面试金典:搜索旋转排序数组
    题目:整数数组nums按升序排列,数组中的值互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为[nums[k],nums[k+1],...,nums[n-1],nums[0],nums[1],...,nums[k-1]](下标从0开始计数)。例如,[0,1,2,4,5,6,7]在下标3处......
  • #yyds干货盘点# LeetCode面试题:柱状图中最大的矩形
    1.简述:给定n个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为1。求在该柱状图中,能够勾勒出来的矩形的最大面积。 示例1:输入:heights=[2,1,5,6,2,3]输出:10解释:最大的矩形为图中红色区域,面积为10示例2:输入:heights=[2,4]输出:42.代码实现:classSolut......
  • [Linux]raspbian安装xrdp(远程桌面)
    1.首先换源:输入以下命令sudosed-i"s@http://deb.debian.org@https://mirrors.163.com@g"/etc/apt/sources.list2.update是更新软件列表,upgrade是更新软件。这两个命令一般是一起使用的。3.需要在Debian系统中安装xrdp,xrdpisadaemonthatsupportsMicrosoft'sRemote......
  • 91-云原生操作系统-Kubernetes网络通信常见架构及案例解析
    VxLAN技术演进VxLAN的技术演进二层通信-基于目标mac地址通信,不可夸局域网通信,通常是由接入交换机或汇聚交换机实现报文转发。VLAN(VirtualLocalAreaNetwork)-即虚拟局域网,是将一个物理(交换机)的网络在逻辑上划分成多个广播域的通信技术,VLAN内的主机间可以直接通信,而VLAN网络外......
  • P9118 [春季测试 2023] 幂次
    二诊前愉快的一次测试,关键是还有奶茶喝第二题,本来直接暴力去重枚举可以的六十分的,但是。。。。。。。花了30分钟优化剪纸,优化空间后,惨变35分。考场代码:#include<bits/stdc++.h>usingnamespacestd;unsignedlonglongn;intk,cnt=1;map<longlong,int>mp;intmain(){ ......
  • 【DP】LeetCode 1143. 最长公共子序列
    题目链接1143.最长公共子序列思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数组的动态规划问题中,一般dp[i]都是表示以nums以前i个元素组成(即nums[i-1])的状态;dp[i][j]分别表示以nums1前i个元素......
  • 20220626leetcode周赛(前3道)
    title:20220622leetcode周赛(前3道)第一题,难度:简单6101.判断矩阵是否是一个X矩阵题目描述:如果一个正方形矩阵满足下述全部条件,则称之为一个X矩阵:矩阵对角线上的所有元素都不是0矩阵中所有其他元素都是0给你一个大小为nxn的二维整数数组grid,表示一个正方形......
  • leetcode200.岛屿数量
    title:leetcode200.岛屿数量题目描述:给你一个由'1'(陆地)和'0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例1:输入:grid=[["1","1","1","......
  • 【DP】LeetCode 718. 最长重复子数组
    题目链接718.最长重复子数组思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数组的动态规划问题中,一般dp[i]都是表示以nums以第i个元素组成(即nums[i-1])的状态;dp[i][j]分别表示以nums1前i个元素(......