前言:不知不觉又断更一天了,其实昨天就把这道题写得差不多了,只是刚好在力扣里面看见了一种新的解法,本来想写出来的,但是我把它推到今天了,因为太晚了,但是今天又睡懒觉了,所以我直接写出思路,就不写代码了,今天在写了这道题的题解之后,我觉得我之前写的力扣第十题的题解相比于这道题还是太过于稚嫩了,没有抓到主体上面,不够通俗易懂,都是它的缺点

解题思路:

        1.获取信息:

                给定一个字符串和一个字符模式

                字符模式中包含小写字母,?以及 * 

                ?:可以匹配任何单个字符

                *  :可以匹配任意字符序列(包括空字符序列)

                要求判断字符模式是否能完全匹配字符串

        2.分析题目:

                在看到这道题的时候,我想到了之前写过的,力扣第十题,正则表达式

                它也是给定一个字符串和字符模式,只不过字符模式中的特殊符号的功能比这道题中的要复杂一些,所以这道题可以说是一道简化后的第十题

                那么,它的方法就不言而喻了,与第十题一样,是动态规划法,但我转念一想,要是方法都不怎么改变,没有多少新意,那怎么能考验自己呢?

                所以我又尝试用它的核心思想写了一下递归法,但是很遗憾,在1638个示例的时候,超时了,不过我还是会讲解一下,也许可以帮助你理解

                最后,我会讲解一下力扣看到的那个新方法,也很不错的

        3.示例查验:

                略

        4.尝试编写代码:

                (1)动态规划法:

                        思路:动态规划:用小问题来逐步推导出大问题

                        我们知道在面对通配符,肯定是需要考虑多种情况的,就以遇到 * 为例

                        遇到 * ,它就会存在两种情况,它表示空字符或者表示非空字符

                        表示空字符,那就无事发生

                        表示非空字符,那它可能表示一个字符,两个字符或者更多的字符

                        这些都是需要考虑的情况

                        实际上,动态规划并不能解决我上面说的需要考虑多种情况的难题

                        动态规划解决的只是,一个既定事实的未来发展而已,就比如说,它的下一步的发展是取决于上一步的确定,所以我们动态规划实行的方式如下

                        先说一下前提,我们肯定是要扫描字符来进行匹配的,那么以谁为主体开始扫描呢?

                        那肯定是字符模式了,因为字符模式中不止存在小写字母

                        好了,说回动态规划

                        以扫描字符模式为主体,会遇到三种情况

                        1.小写字母,比较字符串中对应位置,相同,则继续,不同,直接结束

                        2.?,可以匹配任意字符,直接继续

                        3. * ,需要考虑表示空字符和非空字符的情况

                        如你所见,这些判断都是默认前面的字符完全相匹配的情况下,才可以这么判断

                        并且,在遇到 * ,动态规划就显得有些手足无措了,所以单纯的动态规划不能解决遇到 * 的情况

                        所以,我们如果是个机器,要处理这样的问题,我们只会遍历完所有的情况,让所有的情况都用动态规划走一遍,那么只要有一条走得通,那么就说明可以匹配

                        其实核心不怎么在动态规划,而是这个遍历完所有的情况的步骤

                        我们在遇到 * 时,就依次遍历,* 表示零个字符,一个字符,两个字符等多个字符的情况,只要有一条走得通,那么就表示匹配成功

                        以下是完整代码

class Solution {
public:bool isMatch(string s, string p) {//代码跟力扣第十题大致没有多少区别,就不进行注释了int m=s.size();int n=p.size();vector<vector<bool>>dp(m+1,vector<bool>(n+1,false));dp[m][0]=false;dp[0][0]=true;for(int j=1;j<=n;j++){if(p[j-1]=='*')dp[0][j]=true;else break;}for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(p[j-1]=='*'){dp[i][j]=dp[i][j-1]||dp[i-1][j];}else if(p[j-1]=='?'){dp[i][j]=dp[i-1][j-1];}else{dp[i][j]=(s[i-1]==p[j-1])&&dp[i-1][j-1];}}}return dp[m][n];}
};

                (2)递归法:

                        思路:上面我们说了遇到星号,要依次遍历每种情况,我就想到用递归这种方便推行多种情况的方法,来对每种情况进行遍历

                        但是很遗憾,如我上面所说,在第1638个示例的时候,超时了

                        以下是完整代码

class Solution {
public:bool isMatch(string s, string p) {return GetRes(s,p,0,0,s.size(),p.size());}
private:bool GetRes(string&s,string&p,int i,int j,int m,int n){if(j==n)return i==m;if(i==m){while(j<n&&p[j]=='*')j++;return j==n;}if(p[j]=='*'){return GetRes(s,p,i,j+1,m,n)||GetRes(s,p,i+1,j,m,n);}else if(p[j]=='?'){return GetRes(s,p,i+1,j+1,m,n);}else{if(s[i]==p[j]){return GetRes(s,p,i+1,j+1,m,n);}else return false;}}
};

                (3)贪心算法:

                        这是我在力扣上面看到的题解,比较惊奇,我一开始没有想出来,故而记录下来

                        思路:在字符模式中,比较麻烦的就是碰到星号,其他的符号不值一提

                        如果没有星号,这道题会变得特别简单,所以,有没有办法去无视星号呢?

                        当然有,星号出现零次的情况不用考虑,特别简单,就直接说星号出现非零次的情况

                        那么字符模式的样式,差不多就是 " xxx * xxx * xxx * xxx "等样式

                        因为星号可以表示任意字符序列,所以,我们只用判断那些 xxx 的是否存在字符串之中,并且它们的相对位置是否一致,就可以表明是相匹配的

以上就是本次题解了,我这个暑假要去学车,科目一的题目还没有开始练,不知道自己暑假为什么会这么懒惰,天天不是玩云顶之弈去找虐,就是打排位去找气受,不知道我的脑袋里面在想啥

唉,算了,算了,我已经把游戏给删掉了,顶多每天上线打一下日活,不能再堕落下去了

提醒:纸上得来终觉浅,绝知此事要躬行

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

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

相关文章

WHAT - 依赖管理工具 CocoaPods

文章目录1. 什么是 CocoaPods&#xff1f;2. 如何安装 CocoaPods&#xff1f;(1) 确保已安装 Ruby&#xff08;macOS 默认自带&#xff09;(2) 安装 CocoaPods(3) 验证安装3. 在 React Native 项目中使用 CocoaPods(1) 进入 iOS 目录(2) 初始化 Podfile&#xff08;如果不存在&…

C++ Boost Aiso TCP 网络聊天(服务端客户端一体化)

代码功能说明: 程序模式: 主动连接模式:当用户指定对端 IP 和端口时,尝试连接到对端被动监听模式:当用户未指定对端 IP 时,等待其他节点连接线程模型: 主线程:处理用户输入和消息发送接收线程:后台接收并显示对端消息关键组件: std::atomic<bool> connected:原…

WeakAuras 5.12.9 Ekkles lua

3.45猎人宝宝狼 技能恢复宏已知3.45BUG RL技能位会清空&#xff0c;小退大退 BB技能全部激活&#xff0c;修复以前可用宏一键恢复状态-------方法一&#xff1a;宏命令---------------------------------------------------------#showtooltip 狂怒之嚎 /petautocaston [btn:1]…

对于编写PID过程中的问题

当stm32RCT6使用位置环pid控制麦轮转动一定路程时&#xff0c;在这个时间段内想让一边轮胎速度加大应该怎么做&#xff1f;比如我pid的目标脉冲值为9000&#xff0c;在运行到3000的时候车偏左了&#xff0c;那我应该怎样让他回正&#xff0c;我想到的办法是增加其最大的脉冲值&…

LeetCode|Day13|88. 合并两个有序数组|Python刷题笔记

LeetCode&#xff5c;Day13&#xff5c;88. 合并两个有序数组&#xff5c;Python刷题笔记 &#x1f5d3;️ 本文属于【LeetCode 简单题百日计划】系列 &#x1f449; 点击查看系列总目录 >> &#x1f4cc; 题目简介 题号&#xff1a;88. 合并两个有序数组 难度&#xf…

【C++】初识C++(1)

个人主页&#xff1a;我要成为c嘎嘎大王 希望这篇小小文章可以让你有所收获&#xff01; 目录 前言 一、C的第一个程序 二、命名空间 2.1 namespace 的价值 2.2 namespace 的定义 2.2.1 正常的命名空间定义 2.2.2 命名空间可以嵌套 2.2.3 匿名命名空间 2.2.4 同名的name…

在新闻资讯 APP 中添加不同新闻分类页面,通过 ViewPager2 实现滑动切换

在新闻资讯 APP 中添加不同新闻分类页面&#xff0c;通过 ViewPager2 实现滑动切换 核心组件的作用 ViewPager2&#xff1a;是 ViewPager 的升级版&#xff0c;基于RecyclerView实现&#xff0c;支持水平 / 垂直滑动、RTL&#xff08;从右到左&#xff09;布局&#xff0c;且修…

vuex操作state为什么要使用mutations作为规范而不是直接修改state

1. 状态变更的可追踪性 (Trackable Changes)Devtools 集成&#xff1a;Vue Devtools 可以捕获每次 mutation 的执行记录&#xff0c;记录变更前后的 state 快照、参数和调用栈。直接修改 state&#xff1a;Devtools 无法检测到变更来源&#xff0c;导致调试困难&#xff08;如无…

Spring AI 系列之九 - RAG-入门

之前做个几个大模型的应用&#xff0c;都是使用Python语言&#xff0c;后来有一个项目使用了Java&#xff0c;并使用了Spring AI框架。随着Spring AI不断地完善&#xff0c;最近它发布了1.0正式版&#xff0c;意味着它已经能很好的作为企业级生产环境的使用。对于Java开发者来说…

【数据结构】基于顺序表的通讯录实现

目录 1 顺序表的概念及结构 1.1 线性表 1.2 顺序表分类 1.2.1 静态顺序表 1.2.2 动态顺序表 2 顺序表的实现 2.1 顺序表的初始化 2.2 顺序表中数据的增加和修改 2.2.1 顺序表的头插 2.2.2 顺序表的尾插 2.2.3 顺序表的头删 2.2.4 顺序表的尾删 2.2.5 顺序表指定位置…

C语言与汇编混合编程

一、GCC 扩展语法与MSVC约束 &#xff08;一&#xff09;GCC&#xff08;GNU Compiler Collection&#xff09;内联汇编语法 asm("汇编指令");#或者 __asm__("汇编指令");#使用更复杂的语法来指定输入、输出操作数和修改的寄存器&#xff1a; asm volatile…

WPF中的ListBox详解

文章目录简介ListBoxItem选中项目动态列表简介 【ListBox】是列表控件&#xff0c;其内部可包含多个【ListBoxItem】&#xff0c;用户可以从列表中选择一个或多个项&#xff0c;若Item个数超过指定高度&#xff0c;则右侧会自动出现滚动条&#xff0c;非常便捷。尽管逻辑上来说…

【历史人物】【李白】生平事迹

目录 一、李白个人简历 二、个人主要经历 三、个人成就及影响 1、诗 2、词 3、书法 4、剑术 5、理想 四、历史评价 五、趣事 1、李白搁笔 2、赠汪伦 一、李白个人简历 基本信息‌ 姓名&#xff1a;李白&#xff0c;字太白&#xff0c;号青莲居士 性别&#xff1…

HALCON+PCL混合编程

HALCON与PCL的混合编程基础 HALCON和PCL(Point Cloud Library)都是处理3D数据的强大工具&#xff0c;但它们有着不同的设计目标和数据结构。HALCON专注于机器视觉应用&#xff0c;提供了丰富的图像处理和分析功能&#xff1b;而PCL则是专门为点云处理设计的开源库。 要实现两者…

JavaScript书写基础和基本数据类型

JavaScript书写基础和基本数据类型 jarringslee js书写基础和规范 js是一种在客户端&#xff08;浏览器&#xff09;运行的编程语言&#xff0c;可实现人机交互的效果。js组成&#xff1a; js由两部分组成&#xff1a; ECMAScript&#xff1a;js的语言基础&#xff0c;js遵循其…

CSS个人笔记分享【仅供学习交流】

1、调整透明度 .text{ background-color: rgba(0, 0, 0, 0.08); }解释&#xff1a;rgba&#xff08;rgb三元素&#xff0c;透明度取值从0~1&#xff09; 2、文字和图片对齐方式 长用于头像旁边的昵称居中显示<img src"img/hua" alt"">华仔</img&g…

24.找到列表中最大或最小值的索引

找到列表中最大或最小值的索引 在 Python 中,如果你想找出某个列表中最小或最大值的位置(索引),你可以通过两步快速实现: 使用 min() 或 max() 获取目标值使用 .index() 获取目标值在列表中的索引位置✅ 基础实现 def min_element_index(arr):return arr.index(min(arr)

如何解决pip安装报错ModuleNotFoundError: No module named ‘pandas’问题

【Python系列Bug修复PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘pandas’问题 摘要 在使用 PyCharm 的 Python 控制台或终端执行 pip install pandas 后&#xff0c;仍然出现 ModuleNotFoundError: No module named ‘pandas…

【env环境】rtthread5.1.0使用fal组件

配置 board/Kconfigconfig BSP_USING_ON_CHIP_FLASHbool "Enable On Chip Flash"default ncp rt-thread/components/fal/samples/porting/fal_cfg.h board/fal_cfg.h /** Copyright (c) 2006-2018, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.…

C++20 协程参考手册详解 - 源自 cppreference.com

C20 协程参考手册详解 - 源自 cppreference.com 人话版 先说“人说”&#xff0c;简化版本&#xff0c;更易理解。 宏观概念&#xff1a;协程是一个可以暂定和恢复执行的函数。&#xff08;普通函数是线程相关的&#xff0c;函数的调用依赖于线程栈&#xff0c;而协程的运行…