求职Leetcode题目(9)

news2024/9/24 23:28:11

1.通配符匹配 

题解:

其中,横轴为string s,纵轴为pattern p
这个表第(m,n)个格子的意义是:【p从0位置到m位置】这一整段,是否能与【s从0位置到n位置】这一整段匹配

也就是说,如果表格的下面这一个位置储存的是T(True):
说明,"adcb"和"a*b"这一段是可以匹配的,你不用管前面发生了什么,你只要知道,这两段是匹配的,这就是动态规划为什么很棒棒

描述:如果这一行是"*",可以从上一行的任意T出发,向下、右铲平这一行的任意道路 

在讲解另一个狠角色"?"之前,我们再往下走两步,巩固一下之前的知识。
接下来我们在pattern里遇到了一个b,它是一个普通字母,所以只能从上一行某个T往右下角走到达,而且字母匹配才能记录T,于是我们发现可以走这两步:

描述:如果这一行是"?",从上一行某个T也只能向右下角走,但不必匹配字母就能记录T
示例:

class Solution {
    public boolean isMatch(String ss, String pp) {
        int n = ss.length(), m = pp.length();
        // 技巧:往原字符头部插入空格,这样得到 char 数组是从 1 开始,而且可以使得 f[0][0] = true,可以将 true 这个结果滚动下去
        ss = " " + ss;
        pp = " " + pp;
        char[] s = ss.toCharArray();
        char[] p = pp.toCharArray();
        // f(i,j) 代表考虑 s 中的 1~i 字符和 p 中的 1~j 字符 是否匹配
        boolean[][] f = new boolean[n + 1][m + 1];
        f[0][0] = true;
        for (int i = 0; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (p[j] == '*') {
                    f[i][j] = f[i][j - 1] || (i - 1 >= 0 && f[i - 1][j]);
                } else {
                    f[i][j] = i - 1 >= 0 && f[i - 1][j - 1] && (s[i] == p[j] || p[j] == '?');
                }
            }
        }
        return f[n][m];
    }
}

2.解码方法 

 

 

我们先来理解一下题目的解码规则,如样例所示,s = "226",可以分为两种情况:

1、将每一位数字单独解码,因此可以解码成"BBF"(2 2 6)。
2、将相邻两位数字组合起来解码(组合的数字范围在10 ~ 26之间),因此可以解码成"BZ"(2 26), "VF"(22 6)。
两种情况是或的关系,互不影响,将其相加,那么226共有3种不同的解码方式,下面来讲解动态规划的做法。

状态表示:f[i]表示前i个数字一共有多少种解码方式,那么,f[n]就表示前n个数字一共有多少种不同的解码方式,即为答案。

设定字符串数组为s[](数组下标从1开始),考虑最后一次解码方式,因此对于第i - 1和第i 个数字,分为两种决策:

1、如果s[i]不为0,则可以单独解码s[i],由于求的是方案数,如果确定了第i个数字的翻译方式,那么解码前i个数字和解码前i - 1个数的方案数就是相同的,即f[i] = f[i - 1]。(s[]数组下标从1开始)

2、将s[i]和s[i - 1]组合起来解码( 组合的数字范围在10 ~ 26之间 )。如果确定了第i个数和第i - 1个数的解码方式,那么解码前i个数字和解码前i - 2个数的方案数就是相同的,即f[i] = f[i - 2]。(s[]数组下标从1开始)

最后将两种决策的方案数加起来,因此,状态转移方程为: f[i] = f[i - 1] + f[i - 2]。 

class Solution {
    public int numDecodings(String s) {
        int n = s.length();
        int[] f = new int[n + 10];
        f[0] = 1;
        for(int i = 1; i <= n;i ++)
        {
            if(s.charAt(i - 1) != '0') f[i] = f[i - 1]; //单独解码s[i - 1]
            if(i >= 2)
            {
                int t = (s.charAt(i - 2) - '0') * 10 + s.charAt(i - 1) - '0';
                if(t >= 10 && t <= 26) f[i] += f[i - 2]; //将s[i - 2] 和 s[i - 1]组合解码
            }
        }
        return f[n];
    }
}

3.反转链表 || 

这里首先讲解一下如何反转一个链表

public ListNode reverseList(ListNode head) {  //1
    ListNode prev = null;   // 2
    ListNode curr = head;   // 3
    while (curr != null) {   //4
        ListNode nextTemp = curr.next; //5
        curr.next = prev;  // 6 
        prev = curr;  //7
        curr = nextTemp; //8
    } 
    return prev;  //9
}

 第一行代码图解

public ListNode reverseList(ListNode head) {  //1

我们顺着题目描述意思,假设链表就有1、2、3个元素吧,后面还跟着一个null,又因为输入是ListNode head,所以这个即将要反转的链表如下:

ListNode prev = null;   // 2

 将null赋值给prev,即prev指向null,可得图如下:

ListNode curr = head;

将链表head赋值给curr,即curr指向head链表,可得图如下:

循环部分代码图解

 while (curr != null) {   //4
        ListNode nextTemp = curr.next; //5
        curr.next = prev;  // 6 
        prev = curr;  //7
        curr = nextTemp; //8
    }

循环部分是链表反转的核心部分,我们先走一遍循环,图解分析一波。

因为curr指向了headhead不为null,所以进入循环。先来看第5行:

ListNode nextTemp = curr.next; //5

把curr.next 赋值给nextTemp变量,即nextTemp 指向curr的下一节点(即节点2),可得图如下:

curr.next = prev; // 6  

然后我们看执行到第7行

 prev = curr;  //7

 把curr赋值给prev,prev指向curr,图解如下:

接着,我们执行到第8行:

curr = nextTemp; //8

 把nextTemp赋值给curr,即curr指向nextTemp,图解如下:

至此,第一遍循环执行结束啦,回到循环条件,curr依旧不为null,我们继续图解完它。 

执行完ListNode nextTemp = curr.next;后: 

执行完curr.next = prev;后: 

大概是这么个思路,依次循环。

接下来详细讲解本题:

  • 第 1 步:先将待反转的区域反转;
  • 第 2 步:把 pre 的 next 指针指向反转以后的链表头节点,把反转以后的链表的尾节点的 next 指针指向 succ

 

接下来是这道题的完整代码:

class Solution {
    public ListNode reverseBetween(ListNode head, int left, int right) {
        // 因为头节点有可能发生变化,使用虚拟头节点可以避免复杂的分类讨论
        ListNode dummyNode = new ListNode(-1);
        dummyNode.next = head;

        ListNode pre = dummyNode;
        // 第 1 步:从虚拟头节点走 left - 1 步,来到 left 节点的前一个节点
        // 建议写在 for 循环里,语义清晰
        for (int i = 0; i < left - 1; i++) {
            pre = pre.next;
        }

        // 第 2 步:从 pre 再走 right - left + 1 步,来到 right 节点
        ListNode rightNode = pre;
        for (int i = 0; i < right - left + 1; i++) {
            rightNode = rightNode.next;
        }

        // 第 3 步:切断出一个子链表(截取链表)
        ListNode leftNode = pre.next;
        ListNode curr = rightNode.next;

        // 注意:切断链接
        pre.next = null;
        rightNode.next = null;

        // 第 4 步:同第 206 题,反转链表的子区间
        reverseLinkedList(leftNode);

        // 第 5 步:接回到原来的链表中
        pre.next = rightNode;
        leftNode.next = curr;
        return dummyNode.next;
    }

    private void reverseLinkedList(ListNode head) {
        // 也可以使用递归反转一个链表
        ListNode pre = null;
        ListNode cur = head;

        while (cur != null) {
            ListNode next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = next;
        }
    }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2093407.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SprinBoot+Vue学生选课小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

Ubuntu 24.04 VMware里面设置静态ip上网

1.VMware里面设置网络为桥接模式 2.Ubuntu里面检查网卡名称 [~] ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:…

python图像类型分类汇总

图型所在包样例例图热图seabornimport matplotlib.pyplot as plt import seaborn as sns sns.heatmap(df.isnull()) plt.show() Bitmap Bitmap import numpy as np # 获取数据 fraud data_df[data_df[Class] 1] nonFraud data_df[data_df[Class] 0] # 相关性计算 cor…

Leetcode 404-左叶子之和

题目 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 题解 二叉树的题目&#xff0c;如果需要返回某个值&#xff0c;可以分左右子树递归计算&#xff0c;最后sumleftright 递归三部曲&#xff1a; 确定递归函数的参数和返回值 判断一个树的左叶子节点之和&…

函数式接口实现策略模式

函数式接口实现策略模式 1.案例背景 我们在日常开发中&#xff0c;大多会写if、else if、else 这样的代码&#xff0c;但条件太多时&#xff0c;往往嵌套无数层if else,阅读性很差&#xff0c;比如如下案例&#xff0c;统计学生的数学课程的成绩&#xff1a; 90-100分&#…

微分方程(Blanchard Differential Equations 4th)中文版Section6.1

拉普拉斯变换 积分变换 在本章中&#xff0c;我们研究了一种工具——拉普拉斯变换&#xff0c;用于解微分方程。拉普拉斯变换是众多不同类型的积分变换之一。一般来说&#xff0c;积分变换解决的问题是&#xff1a;一个给定的函数 y ( t ) y(t) y(t) 在多大程度上“像”一个…

温馨网站练习运用

第二次与团队一起制作网页虽然不进行商用&#xff0c;但是练习一下还是好的&#x1f60a;&#x1f60a; 我主要负责后端部分&#xff0c;该项目用了SpringBoot框架、SpringSecurity的安全框架、结合MyBatis-Plus的数据库查询。如果想看看&#xff0c;网站&#xff1a;温馨网登…

Python基础性知识(中部分)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1、Python中的语句1.1 顺序语句1.2 条件语句1.3 循环语句1.3.1 while循环1.3.2 for循环1.3.3 break与continue语句 1.4 综合三大语句制作小游戏--人生重开模拟器…

opencv之形态学

文章目录 1. 什么是形态学2. 形态学操作2.1 腐蚀2.2 膨胀2.3 通用形态学函数2.4 开运算2.5 闭运算2.6 形态学梯度运算2.7 礼帽运算2.8 黑帽运算 1. 什么是形态学 在图像处理领域&#xff0c;形态学是一种基于形状的图像分析技术&#xff0c;用于提取和处理图像的形态特征。这包…

存储架构模式-分片架构和分区架构

分片架构 分片架构就可以解决主从复制存在的问题&#xff0c;如果主机能够承担写的性能&#xff0c;那么主从就够了&#xff0c;如果不能&#xff0c;那么就需要分片架构了。 分片架构设计核心 分片架构设计核心-分片规则 案例1&#xff1a;不合理&#xff0c;因为不同年龄是不…

echarts组件——饼图

echarts组件——饼图 饼图&#xff0c;环形图 组件代码 <template><div :class"classname" :style"{height:height,width:width}" /> </template><script> // 环形图 import * as echarts from echarts require(echarts/them…

计算机毕业设计PySpark+Scrapy农产品推荐系统 农产品爬虫 农产品商城 农产品大数据 农产品数据分析可视化 PySpark Hadoop

(1)能够根据计算机软硬件知识和数学知识给出复杂工程设计的基本思路和解决方案&#xff1b;在考虑社会、健康、安全、法律、文化以及环境等因素下可对设计方案及软硬件系统等在技术、经济等方面进行评价&#xff0c;确认其可行性&#xff1b; (2)能够建立软硬件系统、应用数学、…

【鸿蒙开发】02 复刻学习文档之待办列表

文章目录 一、前言叨叨二、创建应用三、项目初始化及代码分析1. 应用启动入口2. 解读Demo代码并Copy3、常量数据及静态资源文件AppStore下的resourcesentry下的resources 四、效果展示 一、前言叨叨 在考试内容看完之后&#xff0c;并且获取到了高级认证&#xff0c;但是在真正…

linux系统中USB模块鼠标驱动实现

各位开发者大家好,今天主要给大家分享一下,Linux系统中使用libusb的方法以及鼠标驱动实现。 第一:libusb概述 参考网址:* libusb GIT仓库:https://github.com/libusb/libusb.git * libusb 官网:https://libusb.info/ * libusb API接口:https://libusb.sourceforge.io/…

python中logging库使用

文章目录 1、前言2、日志的等级3、logging的基本应用4、logging的进阶应用5、logging的高阶应用6、简单调用7、参考 1、前言 编程代码中&#xff0c;日志的合理使用&#xff0c;能够很好地监控代码的运行过程&#xff1b;在业务部署中&#xff0c;通过日志的记录情况&#xff0…

5G NR 辅同步信号SSS介绍 MATLAB实现

5G NR辅同步信号SSS&#xff0c;和PSS一起包含了小区的全部ID信息&#xff0c;跟NBIOT 和LTE不一样&#xff0c;PSS和SSS并不携带任何的帧信息&#xff0c;只携带帧头同步信息&#xff0c;所以搜索完成PSS和SSS并不知道当前的slot号和帧号&#xff0c;在5G NR中&#xff0c;PSS…

Clion 使用

1. 使用CLion进行ROS开发 安装基本的ROS环境 ROS环境的安装请参考安装ROS。 安装CLion 下载CLion Linux的下载地址如下&#xff1a;CLion 解压CLion 将下载的CLion复制到/opt目录下&#xff08;你可以解压到适合自己的文件夹&#xff0c;只要保证后续使用的路径一致即可…

黑神话悟空-用签名检查以允许加载 mod .pak(安装MOD可以不用再使用“ -fileopenlog “命令)

安装 下载并解压到 BlackMythWukong\b1\Binaries\Win64 位置参考&#xff1a; 安装此 mod 后&#xff0c;再安装.pak类型MOD时就可以不再使用" -fileopenlog "命令也可以生效了.因为该命令可能会导致在具有常规 HDD 的低配置计算机上卡顿。 下载地址&#xff1a;h…

macos 10.15 Catalina 可用docker最新版本 Docker Desktop 4.15.0 (93002) 下载地址与安装方法

按照docker官方的4.16.0版本发行日志"4.16.0: (2023-01-12 Minimum OS version to install or update Docker Desktop on macOS is now macOS Big Sur (version 11) or later.)" , 这个4.16.0版本就必须要求最低版本os为 11版本, 所以 旧版本的macos 10.15 Catalina …

为了支持XR,3GPP R18都做了哪些增强?

这篇是R18 XR enhancement的第二篇,主要看下从NAS->L3->L2->L1针对XR都做了哪些增强。 1 PDU set QoS 在UL和DL中,XR-Awareness有助于优化gNB无线资源调度,但是这里就依赖于 PDU set和data burst。这两个东西是什么意思?其实PDU set就是由一个或多个 PDU组成,这…