通配符匹配

news2024/11/21 16:20:34

题目链接

通配符匹配

题目描述

注意点

  • 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.coloradmin.cn/o/1191933.html

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

相关文章

小型企业如何数字化转型?ZohoCRM助力小企业转型

小型企业数字化之路倍加艰难&#xff0c;其组织规模有限、资源有限&#xff0c;数字化布局或转型&#xff0c;也存在与数字平台匹配度的问题。其实小型企业可以通过CRM客户管理系统实现高效的客户关系管理&#xff0c;进一步提高市场竞争力。 建立高效易用的客户关系管理系统 …

OpenAI重磅推出GPTs,无需编码人人可以自定ChatGPT!

原创 | 文 BFT机器人 在11月7日深夜2点&#xff08;北京时间&#xff09;&#xff0c;美国旧金山举办了首届开发者大会&#xff0c;该活动由AI领域的知名公司OpenAI主办。尽管这是该公司的首届大会&#xff0c;但其盛大的规模和影响力已将其誉为“AI春晚”。在会议上&#xff…

关于echarts封装组件以及多次更新数据信息加载问题

项目中经常使用到echarts插件&#xff0c;使用时会遇到封装组件的问题&#xff0c;一个组件到底怎么封装才是完善的&#xff1f;仁者见仁智者见智思路不同封装的方式就是不同的。废话不多直接上封装的代码&#xff1a; <template><div :id"id" :style"…

OpenGL_Learn08(坐标系统与3D空间)

目录 1. 概述 2. 局部空间 3. 世界空间 4. 观察空间 5. 剪裁空间 6. 初入3D 7. 3D旋转 8. 多个正方体 9. 观察视角 1. 概述 OpenGL希望在每次顶点着色器运行后&#xff0c;我们可见的所有顶点都为标准化设备坐标(Normalized Device Coordinate, NDC)。也就是说&#x…

两台Linux服务器之间传送文件

两台Linux服务器之间传送文件 将U盘上的数据传送到服务器上 本地U盘 远程服务器地址&#xff1a; 192.168.30.125 传送到data文件夹的下面 scp -r coco2017 s192.168.30.125:/data传送 两台Linux服务器之间传送文件的4种方法

pytorch搭建squeezenet网络的整套工程(升级版)

上一篇当中&#xff0c;使用pytorch搭建了一个squeezenet&#xff0c;效果还行。但是偶然间发现了一个稍微改动的版本&#xff0c;拿来测试一下发现效果会更好&#xff0c;大概网络结构还是没有变&#xff0c;还是如下的第二个版本&#xff1a; 具体看网络结构代码&#xff1a…

进程控制——进程的程序替换

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析&#xff08;3&#xff09; 目录 &#x1f449;&#x1f3fb;进程的程序替换概念&#x…

R语言和jsonlite库编写代码示例

R语言和jsonlite库来下载的程序。 r # 导入jsonlite库 library(jsonlite) # 设置代理主机和端口 proxy_host <- "" proxy_port <- # 使用httr库创建一个对象 proxy <- create_proxy(proxy_host, proxy_port) # 使用httr库的GET方法下载网页内容 url <…

输入网址到网页显示,期间发生了什么?(收藏篇)

解析url 首先浏览器做的第一步工作就是要对 URL 进行解析&#xff0c;从而生成发送给 Web 服务器的请求信息。对 URL 进行解析之后&#xff0c;浏览器确定了 Web 服务器和文件名&#xff0c;接下来就是根据这些信息来生成 HTTP 请求消息了。 DNS解析 通过浏览器解析 URL 并…

学生用什么台灯对眼睛最好?双十一优质好用护眼台灯推荐

护眼台灯作为时下火爆的学生清单单品&#xff0c;深受众多学生以及家长的认可&#xff0c;市面上的护眼台灯品牌众多&#xff0c;但很多品牌存在不合格、劣质、虚假宣传的问题&#xff0c;为了帮大家避坑&#xff0c;我这个资深测评师反复测评了三十多款&#xff0c;今天给大家…

【Linux】进程程序替换

文章目录 替换原理站在进程的角度站在程序的角度初体验及理解原理 替换函数函数解释命名理解exec系列函数与main函数之间的关系在一个程序中调用我们自己写的程序 替换原理 创建子进程的目的是什么&#xff1f; ->想让子进程执行父进程代码的一部分 执行父进程对应的磁盘代码…

ROS源码安装应用,VSCode

ROS源码安装应用 安装一下VSCode 前置文章 到安装程序的目录中: 完成克隆 编译 catkin_make打开ros核心 roscore打开应用程序 rosrun turtlesim turtlesim_node安装一下VSCode deb下载地址 sudo dpkg -i code_1.84.1-1699275408_amd64.deb添加项目工程到工作空间&#xff…

什么是伺服电机?Parker派克伺服电机盘点

一、什么是伺服电机&#xff1f; 要准确地定义伺服电机&#xff0c;我们首先需理解其核心特性&#xff1a;反馈与闭环控制。伺服电机凭借这些特性&#xff0c;能精确控制扭矩、速度或位置&#xff0c;即使在零速度下&#xff0c;也能保持足够的扭矩以锁定负载。 伺服电机与其…

JVS-智能BI数据集管理:打造高效、准确数据应用基础

现今的数字化、智能化时代&#xff0c;数据被誉为企业的新型资产&#xff0c;企业面临的数据量日益庞大&#xff0c;如何对这些数据进行高效、准确的管理和应用&#xff0c;直接决定了企业的运营效率和决策水平。 在这样的背景下&#xff0c;仅仅收集数据并不足够&#xff0c;…

IDEA 关闭SpringBoot启动Logo/图标

一、环境 1、SpringBoot 2.6.4 Maven POM格式 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.4</version><relativePath/></parent> 2、IDE…

第五章《数据降维:深入理解 PCA 的来龙去脉》笔记

主成分分析(Principal Component Analysis&#xff0c;PCA) 就是机器学习中一种常用且有效的数据降维方法。 5.1 PCA是什么 PCA 将相关性高的变量转变为较少的独立新变量&#xff0c;实现用较少的综合指标分别代表存在于 各个变量中的各类信息&#xff0c;既减少高维数据的变…

vue3 自动导入composition-apiI和组件

1.api的自动导入 常规写法&#xff1a; <script setup>import { ref, reactive, onMounted, computed ,watch } from vue;import { useRouter } from "vue-router";const router useRouter();const person reactive ({name&#xff1a;张三&#xff0c;age…

cadence virtuoso layout drc error

For 0.11um design, 2.5/3.3V transistor channel (overlap of Poly and AA) enclosure by DG.( Designer can waive this rule for 0.13um design).>0.30 对于 0.11 微米的设计&#xff0c;2.5/3.3V 晶体管通道&#xff08;Poly 和 AA 的重叠部分&#xff09;由 DG 封装&a…

“三大阶段稳定性测试”筑牢长安链信任基石

前言 随着长安链应用生态的不断丰富、面对的应用场景更加多元&#xff0c;稳定性测试在长安链测试流程中占到越来越重要的位置。本文将介绍长安链稳定性测试的发展历程及如何通过三大阶段稳定性测试应对不断出现的复杂的商业需求&#xff0c;筑牢长安链信任基石。 功能测试和…

Adobe Photoshop 2020给证件照换底

1.导入图片 2.用魔法棒点击图片 3.点选择&#xff0c;反选 4.选择&#xff0c;选择并遮住 5.用画笔修饰证件照边缘 6. 7.更换要换的底的颜色 8.新建图层 9.使用快捷键altdelete键填充颜色。 10.移动图层&#xff0c;完成换底。