通配符匹配

题目链接

通配符匹配

题目描述

注意点

  • s 仅由小写英文字母组成
  • p 仅由小写英文字母、‘?’ 或 ‘*’ 组成
  • ‘?’ 可以匹配任何单个字符
  • ‘*’ 可以匹配任意字符序列(包括空字符序列)

解答思路

  • 最初想到的是dfs + 剪枝,但是用例超时了
  • 参照题解使用动态规划解决本题,其思路为:创建一个大小dp[pLen + 1][sLen + 1]的二维数组,其中i行表示p的第(i - 1)位,j列表示s的第(j- 1)位,dp[i][j]表示p的前(i - 1)位和s的前(j - 1)位是否能匹配,从p的第1个字符开始遍历,判断其是否能和s的前(j - 1)位匹配,如果匹配则置dp[i - 1][j - 1]为true,当处于dp[i][j],有以下几种情况:
    (1)如果p对应i位置的字符为*,则该位置处的字符一定相等,dp[i][j]取决于dp[i][j - 1] || dp[i - 1][j - 1]
    (2)如果p对应i位置的字符为?,则该位置处的字符一定相等,但是不能视为空,dp[i][j]取决于dp[i - 1][j] || dp[i][j - 1] || dp[i - 1][j - 1]
    (3)如果p对应i位置和s对应j位置字符相同,则dp[i][j]也取决于dp[i - 1][j] || dp[i][j - 1] || dp[i - 1][j - 1]
    (4)如果p对应i位置和s对应j位置字符不相同,则dp[i][j]为false
  • 注意p的前n位都为’*'的情况要特殊考虑,由于其可以表示为空字符串,所以可以视为dp[0~n][0]都为true

代码

class Solution {public boolean isMatch(String s, String p) {int sLen = s.length();int pLen = p.length();boolean[][] dp = new boolean[pLen + 1][sLen + 1];dp[0][0] = true;for (int i = 1; i <= pLen; i++) {boolean isSame = false;for (int j = 0; j <= sLen; j++) {// 如果p的前i为都是'*',则dp[i][0]为true('*'可以表示为空字符串所以可以忽略)if (p.charAt(i - 1) == '*' && j == 0 && dp[i - 1][j]) {dp[i][0] = true;isSame = true;continue;}if (j == 0) {continue;}// '*'可以替代为空或任何字符(包括空字符串)if (p.charAt(i - 1) == '*' && (dp[i - 1][j] || dp[i][j - 1] || dp[i - 1][j - 1])) {dp[i][j] = true;isSame = true;continue;}// 该位置前面的子字符串不匹配if (!dp[i - 1][j - 1]) {continue;}// '?'可以匹配任意字符(空字符串除外)if (p.charAt(i - 1) == '?' || p.charAt(i - 1) == s.charAt(j - 1)) {dp[i][j] = true;isSame = true;}}// p的前i位和s无论如何都无法匹配,则可以直接认为s和p无法匹配if (!isSame) {break;}}return dp[pLen][sLen];}
}

关键点

  • 注意p的前n位都为’*'的情况要特殊考虑,由于其可以表示为空字符串,所以可以视为dp[0~n][0]都为true,方便p.charAt(n + 1)与s.charAt(0)进行比较
  • 如果某一行的dp值都为false,说明p的前i位和s无论如何都无法匹配,则可以直接认为s和p无法匹配,进行剪枝可以节省时间

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

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

相关文章

STM32笔记—EXTI外部中断

一、简介 中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继续运行&#xff1b; 中断优先级&…

maven中的install 和 clean命令,以及compile、、package、test等操作介绍

maven中的install命令 主要就是谁要被其他模块依赖就install谁 Maven工具可以进行clean、compile、install、package、test等操作&#xff0c;但是这些操作有什么用呢&#xff0c;以下面的p2p-exterface为例说明一下&#xff0c;pwp-exterface工程目录如下&#xff1a; com…

centos中安装的goland配置sdk报错:所选的目录不是Go SDK的有效主路经

选中目录后一直报错&#xff1a; 正确的位置&#xff1a; 原因竟然是使用 解压go1.21.4.linux-amd64.tar.gz 包出来&#xff0c;少了scr和test目录&#xff0c;重新解压后可以正确设定SDK主目录。 有同样问题的可以确认一下。 tar -C /usr/local -zxvf go1.19.2.linux-amd64.…

随机链表的复制

题目描述 给你一个长度为n的链表&#xff0c;每个节点包含一个额外增加的随机指针random&#xff0c;该指针可以指向链表中的任何节点或空节点。构造这个链表的深拷贝。 深拷贝应该正好由n个全新节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值。新节点的nex…

SpringBoot使用Mybatis

SpringBoot使用Mybatis Orm 框架的本质是简化编程中操作数据库的编码&#xff0c;发展到现在基本上就剩两家了&#xff0c;一个是宣称可以不用写一句 Sql 的 Hibernate&#xff0c;一个是可以灵活调试动态 Sql 的 Mybatis ,两者各有特点&#xff0c;在企业级系统开发中可以根…

解决EnableKeyword(“_Emission“)运行状态不起作用

我使用的是Standard Shader&#xff0c;一开始“_Emission”没有开启 当我运行下面的代码&#xff0c;可以看到Inspector窗口已经生效&#xff0c;然而物体本身并没有重新开始渲染&#xff0c;反射没有开启 public GameObject go; // Start is called before the first frame…

极智开发 | CUDA线程模型与全局索引计算方式

欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文分享一下 CUDA线程全局索引计算方式。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码和资源下载,链接:https://t.zsxq.com/0aiNxERDq CUDA 线程全局索引的计算,是很容…

nuxt项目相关学习

传统服务端渲染流程 单页面应用 1. nuxt 是什么 Nuxt.js 是一个基于 Vue.js 的通用应用框架。 通过对客户端/服务端基础架构的抽象组织&#xff0c;Nuxt.js 主要关注的是应用的 UI 渲染。 就使用而言,组件写法基本和vue相差不大,区别在于几个钩子函数,以及一些服务端渲染相关…

【Linux】:初识git || centos下安装git || 创建本地仓库 || 配置本地仓库 || 认识工作区/暂存区(索引)以及版本库

&#x1f4ee;1.初识git Git 原理与使用 课程⽬标 • 技术⽬标:掌握Git企业级应⽤&#xff0c;深刻理解Git操作过程与操作原理&#xff0c;理解⼯作区&#xff0c;暂存区&#xff0c;版本库的含义 • 技术⽬标:掌握Git版本管理&#xff0c;⾃由进⾏版本回退、撤销、修改等Git操…

【Excel】如何画不同时序交叉的百分比堆积柱状图

这里写自定义目录标题 1 将两表交叉合并为一个表1.1 步骤一&#xff1a;在两独立表的工作天数和工资列下面按1-n顺次标号。1.2 步骤二&#xff1a;选中两表需要合并的部分&#xff0c;调出自定义排序1.3 步骤三&#xff1a;选项 ——> 按行排序 &#xff08;选完后点确定&am…

Java10新增特性

特性列表 Java 10是Java的一个主要版本更新&#xff0c;引入了许多新功能和改进。以下是一些Java 10的新增特性&#xff1a; 局部变量类型推断&#xff1a;Java 10引入了局部变量类型推断&#xff0c;允许开发者使用关键字"var"来声明局部变量&#xff0c;而无需指定…

【STM32】定时器

systick定时器&#xff1a; 【STM32】Systick定时器-CSDN博客 0.通用定时器框图 1.时钟源 2.控制器 3.输入捕获 计数器实际上是与比较寄存器的影子寄存器进行比较的。 4.输出比较 1.STM32的定时器学习要点 参考手册 STM32F1xx中文参考手册.pdf 林何/STM32F103C8 - 码云 -…

Spring的循环依赖问题

文章目录 1.什么是循环依赖2.代码演示3.分析问题4.问题解决5.Spring循环依赖6. 疑问点6.1 为什么需要三级缓存6.2 没有三级缓存能解决吗&#xff1f;6.3 三级缓存分别什么作用 1.什么是循环依赖 上图是循环依赖的三种情况&#xff0c;虽然方式有点不一样&#xff0c;但是循环依…

合成数据在金融服务中的应用

人工智能在金融服务中有着广泛的应用&#xff0c;从流程自动化到聊天机器人和欺诈检测。据估计&#xff0c;到 447 年&#xff0c;银行从人工智能应用中节省的潜在成本总额将达到 2023 亿美元。 但是&#xff0c;其中一些应用程序有其局限性&#xff0c;因为财务数据是最敏感和…

排序算法的空间复杂度和时间复杂度

一、排序算法的时间复杂度和空间复杂度 排序算法 平均时间复杂度 最坏时间复杂度 最好时间复杂度 空间复杂度 稳定性 冒泡排序 O(n) O(n) O(n) O(1) 稳定 直接选择排序 O(n) O(n) O(n) O(1) 不稳定 直接插入排序 O(n) O(n) O(n) O(1) 稳定 快速排序 O(n…

nacos做服务配置和服务器发现

一、创建项目 1、创建一个spring-boot的项目 2、创建三个模块file、system、gateway模块 3、file和system分别配置启动信息,并且创建一个简单的控制器 server.port9000 spring.application.namefile server.servlet.context-path/file4、在根目录下引入依赖 <properties&g…

docker部署es+kibana

es 暴露的端口特别多 &#xff0c;十分耗内存&#xff0c;数据一般要放置到安全目录&#xff0c;挂载 官网推荐的命令&#xff1a;docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" elasticsearch…

高能数造电池3D打印智能制造小试线,开启全固态电池数字化新时代

在科技创新的浪潮中&#xff0c;电池制造领域又迎来了一次突破性的进展。近日&#xff0c;高能数造(西安)技术有限公司重磅推出了其最新电池数字制造装备——全固态电池3D打印智能制造小试线 &#xff0c;这一创新性的技术开启了全固态电池的数字化智造新时代&#xff0c;为全固…

如何在时间循环里最优决策——时间旅行者的最优决策

文章目录 每日一句正能量前言时间旅行和平行宇宙强化学习策略梯度算法代码案例推荐阅读赠书活动 每日一句正能量 做一个决定&#xff0c;并不难&#xff0c;难的是付诸行动&#xff0c;并且坚持到底。 前言 时间循环是一类热门的影视题材&#xff0c;其设定常常如下&#xff1…

Pycharm加载项目时异常,看不到自己的项目文件

最近看到一个朋友问&#xff0c;他把项目导入pycharm为什么项目里的包不在项目里显示&#xff0c;只在projects file里显示&#xff1f;问题截图如下&#xff1a; Project里看不到自己的项目文件 只能在Project Files里看到自己的项目文件 问题解答 我也是偶然发现的这个方案…