求职Leetcode题目(9)

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) {  //1ListNode prev = null;   // 2ListNode curr = head;   // 3while (curr != null) {   //4ListNode nextTemp = curr.next; //5curr.next = prev;  // 6 prev = curr;  //7curr = 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) {   //4ListNode nextTemp = curr.next; //5curr.next = prev;  // 6 prev = curr;  //7curr = 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.rhkb.cn/news/413696.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LoRa】CAD的工作原理以及使用

目录 1 CAD介绍1.1 CAD工作原理1.2 与CAD有关的中断 2 CAD的使用2.1 CAD总耗时2.2 CAD均衡配置2.3 最优配置速查表 3 CAD的应用3.1 CAD项目使用3.2 CAD扩展应用CSMA 4 参考文献 1 CAD介绍 本章介绍一下LoRa芯片的CAD功能、原理以及如何使用。由于第一代SX127x的CAD使用与以后的…

【国铁采购平台-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

Linux的常见指令

前言 Hello,今天我们继续学习Liunx&#xff0c;上期我们简单了解了Linux的基本用处&#xff0c;并了解了Linux的重要性&#xff0c;今天我们就继续更加深入的学习Linux&#xff0c;进行指令方面的学习&#xff0c;我们可以通过先学习简单的基础命令来学习Linux&#xff0c;并在…

使用nvitop来监控 NVIDIA GPU 的使用情况

1.安装nvitop&#xff1a; pip install nvitop2.运行 nvitop: nvitop显示如下&#xff1a; 显示信息含义 1. 顶部信息栏 当前时间&#xff1a;显示当前的系统时间&#xff08;Sat Aug 31 16:33:03 2024&#xff09;。提示信息&#xff1a;提示可以按 h 键获取帮助或按 q 键…

OpenAI 神秘模型「草莓」预计今秋推出,ChatGPT 将迎重大升级|TodayAI

有外媒报道指出&#xff0c;OpenAI 内部代号为「Strawberry&#xff08;草莓&#xff09;」的 AI 模型即将在今年秋季面世。这一消息引发了业内广泛关注&#xff0c;被认为可能会为 ChatGPT 带来今年最重要的升级。 「草莓」模型的强大能力与应用潜力 据《The Information》报…

前端面试——八股文

一、Vue2篇 1. 关于生命周期 1.1 生命周期有哪些&#xff1f;发送请求在created还是mounted&#xff1f; 请求接口测试&#xff1a;https://fcm.52kfw.cn/index.php?_mall_id1&rapi/default/districtVue2.x系统自带有8个 beforeCreate created beforeMount mounted be…

力扣375.猜数字大小 II

力扣375.猜数字大小 II dp dp[i][j]是说依次以从i到j的数字作为分割点(猜的数)&#xff0c;必定赢的游戏所用钱的最小值。 枚举每一列&#xff0c;从下往上算出dp[i][j]&#xff0c;最终答案为dp[1][n] class Solution {public:int getMoneyAmount(int n) {if(n 1)retu…

做影像组学+深度学习技术研究如何发表高分论文,案例解析

论文简介 标题&#xff1a;Longitudinal MRI-based fusion novel model predicts pathological complete response in breast cancer treated with neoadjuvant chemotherapy: a multicenter, retrospective study&#xff08;纵向MRI结合新模型预测新辅助化疗乳腺癌的病理完全…

CSND文章质量分批量查询

简介 CSDN 质量分是一项公开的 CSDN 博文内容质量分析服务&#xff0c;其综合分析了内容的标题、段落结构、正文长度、代码格式及复杂度、链接和超文本内容比例及质量等因素&#xff0c;为 IT 技术文章提供客观公共的质量分析结果 用途 可用与对文章质量做评估可申请创作者 …

【web网页制作】中国传统文化书法主题html网页制作开发div+css(6页面附效果源码)

HTMLCSS传统文化主题书法网页制作 &#x1f354;涉及知识&#x1f964;写在前面&#x1f367;一、网页主题&#x1f333;二、网页效果菜单切换效果PageA、整体页Page1、主页Page2、行书页Page3、楷书页Page4、隶书页Page5、篆书页Page6、草书页 &#x1f40b;三、网页架构与技术…

Python | Leetcode Python题解之第386题字典序排数

题目&#xff1a; 题解&#xff1a; class Solution:def lexicalOrder(self, n: int) -> List[int]:ans [0] * nnum 1for i in range(n):ans[i] numif num * 10 < n:num * 10else:while num % 10 9 or num 1 > n:num // 10num 1return ans

【电子数据取证】Linux软件包管理器yum和编辑器vim

文章关键词&#xff1a;电子数据取证、手机取证、安卓取证、云取证 在Linux系统中&#xff0c;我们会进行一些软件的安装以及对一些服务或软件的配置&#xff0c;这时就需要用到Linux的yum以及编辑器&#xff0c;下面我们就来看一下这两个功能。 Linux软件包管理器yum 一、什…

模型 错位竞争(战略规划)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。与其更好&#xff0c;不如不同。 1 错位竞争的应用 1.1 美团的错位竞争策略 美团&#xff0c;作为中国领先的电子商务平台&#xff0c;面临着阿里巴巴等电商巨头的竞争压力。为了在市场中获得独特的…

Leetcode3243. 新增道路查询后的最短距离 I

Every day a Leetcode 题目来源&#xff1a;3243. 新增道路查询后的最短距离 I 解法1&#xff1a;广度优先搜索 暴力。 每次加边后重新跑一遍 BFS&#xff0c;求出从 0 到 n−1 的最短路。 代码&#xff1a; /** lc appleetcode.cn id3243 langcpp** [3243] 新增道路查询…

URP custompasscustom render objects

https://dbbh666.blog.csdn.net/article/details/141296728?spm1001.2014.3001.5502 上一次 custom render pass的时候&#xff0c;直接是quad的渲染&#xff0c;如果想把任意对象绘制到FBO怎么写呢 参考这两个高手的文章&#xff0c;总结一下 https://www.bilibili.com/read…

前端速通面经八股系列(一)—— CSS篇

CSS高频面经目录 一、CSS基础1. CSS选择器及其优先级2. CSS中可继承与不可继承属性有哪些3. display的属性值及其作用4. display的block、inline和inline-block的区别5. 隐藏元素的方法有哪些6. link和import的区别7. transition和animation的区别8. display:none与visibility:…

win10环境下gvim离线配置插件的一些补充

0 总述 在上一篇博客&#xff0c;即《Windows系统下使用gvim配置LaTeX快速书写环境》一文中&#xff0c;本小白试图模仿神级人物Gilles Castel&#xff0c;打造vim下的 LaTeX \LaTeX LATE​X书写环境。实话实说&#xff0c;东施效颦了。虽不至于一无所得&#xff0c;但也仅仅算…

穿越Java世界的继承奇旅:从基类到子类的华丽蜕变

1.为什么要继承 2.什么是继承以及继承的方式 3.继承的一些语法 4.父类成员的访问 5.关键字super 6.关键字protected 7.关键字final 8.继承与组合 一&#xff1a;为什么要继承 ①代码重用&#xff1a;继承允许我们重用、扩展或修改父类的属性和方法&#xff0c;而无需重…

未使用CMSIS之前的stm32标准库中SystemHandler的宏定义

背景&#xff1a; 在stm32的标准库还叫STM32F10xxx_FWLib_V2.0.3的那个年代 文件 STM32F10xFWLib_V2.0.3/FWLib/library/inc/stm32f10x_nvic.h 中有对System Handlers的定义。具体内容如下&#xff1a; /* System Handlers -------------------------------------------------…

【Altium Designer程序开发】生成XML多级数据库文件 V2.0

此工具用于生成多级多节点的XML数据库文件&#xff0c;主要功能用于测试XML文件的生成速度的&#xff0c;运行环境在Altium Designer中&#xff0c;可用于Altium Designer全系列的版本中。 程序界面如下图所示&#xff0c;每一级节点表示每个父Node的子Node的数量&#xff0c;节…