力扣_字符串3—通配符匹配

题目

给你一个输入字符串 s s s 和一个字符模式 p p p ,请你实现一个支持 ? ? ? ∗ * 匹配规则的通配符匹配:

  • ? ? ? 可以匹配任何单个字符。
  • ∗ * 可以匹配任意字符序列(包括空字符序列)。
    判定匹配成功的充要条件是:字符模式必须能够 完全匹配 输入字符串(而不是部分匹配)。

方法

动态规划

  • s s s 长度为 n 1 n_1 n1, p p p 长度为 n 2 n_2 n2
  • 构造 d p n 1 + 1 , n 2 + 1 dp_{n_1+1, n_2+1} dpn1+1,n2+1 数组
    • d p [ i ] [ j ] = = 1 dp[i][j] == 1 dp[i][j]==1,则表示 s [ 0 , i − 1 ] s[0, i-1] s[0,i1] 可以与 p [ 0 , j − 1 ] p[0,j-1] p[0,j1] 匹配
  • 转移
    • p [ j − 1 ] = = ? p[j-1] == ? p[j1]==?,则 d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] dp[i][j] = dp[i-1][j-1] dp[i][j]=dp[i1][j1] (因为 ? ? ? 可以和任意单个字符匹配)
    • p [ j − 1 ] = = ∗ p[j-1] == * p[j1]==,则,
      • ∗ * 匹配 0 0 0 个字符,则 d p [ i ] [ j ] = d p [ i ] [ j − 1 ] dp[i][j] = dp[i][j-1] dp[i][j]=dp[i][j1] p [ 0 , j − 1 ] p[0,j-1] p[0,j1] s [ 0 , i − 1 ] s[0,i-1] s[0,i1] 是否匹配取决于 p [ 0 , j − 2 ] p[0,j-2] p[0,j2] s [ 0 , i − 1 ] s[0,i-1] s[0,i1] 是否匹配,因为此时 p [ j − 1 ] p[j-1] p[j1] 不参与匹配)
      • ∗ * 匹配 1 1 1 个字符,则 d p [ i ] [ j ] = d p [ i − 1 ] [ j ] dp[i][j] = dp[i-1][j] dp[i][j]=dp[i1][j] p [ 0 , j − 1 ] p[0,j-1] p[0,j1] s [ 0 , i − 1 ] s[0,i-1] s[0,i1] 是否匹配取决于 p [ 0 , j − 1 ] p[0,j-1] p[0,j1] s [ 0 , i − 2 ] s[0,i-2] s[0,i2] 是否匹配,因为此时 p [ j − 1 ] p[j-1] p[j1] 匹配了 s [ i − 1 ] s[i-1] s[i1],还要继续看 p [ j − 1 ] p[j-1] p[j1] 是否匹配 s [ i − 2 ] s[i-2] s[i2]
      • 综上 d p [ i ] [ j ] = d p [ i − 1 ] [ j ] dp[i][j] = dp[i-1][j] dp[i][j]=dp[i1][j] d p [ i ] [ j − 1 ] dp[i][j-1] dp[i][j1]
    • p [ j − 1 ] p[j-1] p[j1] 为字母,
      • s [ i − 1 ] = = p [ j − 1 ] s[i-1] == p[j-1] s[i1]==p[j1],则 d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] dp[i][j] = dp[i-1][j-1] dp[i][j]=dp[i1][j1],否则为0

代码

class Solution {
public:bool isMatch(string s, string p) {int n1 = s.size();int n2 = p.size();vector<vector<int>> dp(n1+1, vector<int>(n2+1));dp[0][0] = 1;for (int i = 1; i <= n2; ++i) {if (p[i - 1] == '*') {dp[0][i] = true;}else {break;}}for(int i = 1; i <= n1; i++){for(int j = 1; j <= n2; j++){if(p[j-1] == '?'){dp[i][j] = dp[i-1][j-1];}else if(p[j-1] == '*'){dp[i][j] = dp[i][j - 1] | dp[i - 1][j];}else{if(p[j-1] == s[i-1]){dp[i][j] = dp[i-1][j-1];}else{dp[i][j] = 0;}}}}return dp[n1][n2];}
};

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

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

相关文章

vue-element-admin npm install 失败解决

git地址&#xff1a;https://github.com/PanJiaChen/vue-element-admin/tree/master 原因&#xff1a; tui-editor插件改名导致 解决方法&#xff1a; 第一步&#xff1a; package.json文件 "tui-editor": "1.3.3",修改为 "toast-ui/editor&qu…

小埋的解密游戏的题解

题目描述 小埋最近在玩一个解密游戏&#xff0c;这个游戏的解密方法是这样的&#xff0c;这个游戏会给你提供 个数,让我们求出这 个数里面&#xff0c;有多少个连续的数的平均数大于某个给定的数 。这个数可能会很大&#xff0c;所以我们要输出这个数对 的取模结果。现在小…

99例电气实物接线及52个自动化机械手动图

给大家分享一些流水线设计中常见的一些结构&#xff0c;这些动态图很直观&#xff0c;有助于大家了解其原理&#xff0c;非常好懂。 1.家庭总电箱接线图 2.经典双控灯接线 3.五孔一开接线 4.电动机点动控制接线&#xff08;不安全&#xff09; 5.电动机自锁接线图&#xff08;…

git常用一些操作

1. git status // 查看当前目录更新 2. git checkout -b <NEW_BRANCH> // 新切一个分支&#xff08;只在第一次操作的时候做&#xff0c;后面就不用做了&#xff09; 3. git pull origin <BRANCH_NAME> …

Vue中跨域问题的解决

目录 1 跨域的概念 2 解决办法 2.1 修改请求实例的公共前缀 2.2 修改vite.config.js文件 1 跨域的概念 由于浏览器的同源策略限制&#xff0c;向不同源(不同协议、不同域名、不同端口)发送ajax请求会失败 2 解决办法 原理&#xff1a;使得浏览器向两个端口发送请求和接手…

怎样理解Vue单向数据流

在前端开发中&#xff0c;数据流是一个非常重要的概念。Vue.js作为一种流行的前端框架&#xff0c;采用了单向数据流的架构&#xff0c;旨在简化开发过程并提高应用的可维护性。本文将探讨Vue单向数据流的含义以及它的使用方法。 什么是单向数据流&#xff1f; 在Vue中&#…

H5 简约四色新科技风引导页源码

H5 简约四色新科技风引导页源码 源码介绍&#xff1a;一款四色切换自适应现代科技风动态背景的引导页源码&#xff0c;源码有主站按钮&#xff0c;分站按钮2个&#xff0c;QQ联系站长按钮一个。 下载地址&#xff1a; https://www.changyouzuhao.cn/11990.html

在Vue中如何动态绑定class和style属性

在Vue中&#xff0c;动态绑定class和style属性是我们经常遇到的需求。这个功能允许我们根据不同的条件来动态改变元素的样式&#xff0c;让我们的应用更加灵活和富有交互性。在本篇博客文章中&#xff0c;我将带你深入探索在Vue中如何实现这一功能。 首先&#xff0c;让我们了…

FPGA高端项目:IMX327 MIPI 视频解码 USB3.0 UVC 输出,提供FPGA开发板+2套工程源码+技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的 MIPI 编解码方案 3、本 MIPI CSI-RX IP 介绍4、个人 FPGA高端图像处理开发板简介5、详细设计方案设计原理框图IMX327 及其配置MIPI CSI RX图像 ISP 处理图像缓存UVC 时序USB3.0输出架构 6、vivado工程详解FPGA逻辑设计 7、工…

flask+pyinstaller实现mock接口,并打包到exe运行使用postman验证

flask代码 from flask import Flask, request, jsonifyapp Flask(__name__)app.route("/login", methods[POST]) def login():username request.json.get("username").strip() # 用户名password request.json.get("password").strip() # 密…

SQL--DDL

全称 Structured Query Language&#xff0c;结构化查询语言。操作关系型数据库的编程语言&#xff0c;定义了 一套操作关系型数据库统一标准。 1 SQL通用语法 在学习具体的SQL语句之前&#xff0c;先来了解一下SQL语言的同于语法。 1). SQL语句可以单行或多行书写&#xff0…

什么是IDE,新手用哪个IDE比较好

什么是IDE IDE&#xff08;Integrated Development Environment&#xff0c;集成开发环境&#xff09;是一种为程序员提供软件开发所需的代码编辑、构建、调试等功能于一体的应用程序。IDE通常包含了代码编辑器、编译器、调试器和图形用户界面等工具&#xff0c;这些工…

解决IntellIJ Idea内存不足

突然有一天我在IDEA打开两个项目时&#xff0c;发生了报错&#xff0c;说我内存不足&#xff0c;我这电脑内存16G怎么会内存不足。下面是我的解决方案。 IntelliJ IDEA 报告内存不足的原因通常与以下几个因素有关&#xff1a; 项目规模较大&#xff1a;如果您正在开发的项目非…

SQL Parser

https://blog.csdn.net/w1047667241/article/details/123110220 alibaba druid 经过不断迭代&#xff0c;已经解决了很多 hive解析的bug&#xff0c;比如 2020年的create tablebug 支持的db type 多&#xff0c;impala ,hive &#xff0c;oracle 等等都支持 。 缺点就是捆绑销售…

git 的一个入门实例

假设你要创建一个新的Git存储库并进行一些基本操作。以下是一个简单的入门实例&#xff1a; 1. **初始化仓库&#xff1a;** bash git init 2. **添加文件&#xff1a;** 创建一个新文件&#xff0c;比如 example.txt&#xff0c;并将其添加到暂存区&#xff1a…

远程手机搭建Termux环境,并通过ssh连接Termux

背景 Termux只能通过鼠标点击&#xff0c;无法使用电脑键盘&#xff0c;输入速度很慢&#xff0c;你想通过ssh 连接Termux&#xff0c;获得友好体验搞了个云手机&#xff0c;想像普通手机那样充当服务器想把自己的手机公开到局域网中供同事调试想把自己的模拟器公开到局域网中…

套路化编程 C# winform 自适应缩放布局

本例程实现基本的自适应缩放布局。 在本例程中你将会学习到如何通过鼠标改变界面比例&#xff08;SplitContainer&#xff09;、如何使用流布局&#xff08;FlowLayoutPanel&#xff09;排列控件&#xff0c;当然首先需要了解如何设置控件随窗口缩放。 目录 创建项目 ​编辑…

Vue 本地存储

在 Vue 中&#xff0c;可以使用localStorage或sessionStorage来进行本地存储。这两种存储方式都是基于浏览器的&#xff0c;并且可以在不同的页面之间共享数据。 1 localStorage 的基本使用 // 在 Vue 实例中使用 const app new Vue({data() {return {username: }},methods:…

【Python基础】函数

文章目录 函数1 函数基础1.1 函数三要素与作用1.2 作用域1.2.1 LEGB原则1.2.3 命名空间 2 匿名函数2.1 一个需求2.2 lambda2.3 匿名函数应用2.3.1 列表排序2.3.2 字典列表排序 3 函数式编程3.1 map函数3.2 reduce函数3.3 fliter函数 4 递归函数4.1 递归基本原理4.2 阶乘实现4.3…

【stm32】hal库学习笔记-ADC模数转换(超详细!)

【stm32】hal库学习笔记-ADC模数转换&#xff08;超详细&#xff01;&#xff09; 本篇章介绍了ADC实现电压检测的三种方式 ADC原理及选型 ADC将连续的模拟电压信号转换为二进制的数字信号 选型参数 速度&#xff08;采样频率&#xff09; 功耗 精度 转换原理 ADC hal库驱…