【LeetCode: 44. 通配符匹配 | 暴力递归=>记忆化搜索=>动态规划 】

news2024/9/20 23:30:20

在这里插入图片描述

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

在这里插入图片描述

🍔 目录

    • 🚩 题目链接
    • ⛲ 题目描述
    • 🌟 求解思路&实现代码&运行结果
      • ⚡ 暴力法
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
      • ⚡ 记忆化搜索
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
      • ⚡ 动态规划
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
    • 💬 共勉

🚩 题目链接

  • 44. 通配符匹配

⛲ 题目描述

给你一个输入字符串 (s) 和一个字符模式 § ,请你实现一个支持 ‘?’ 和 ‘’ 匹配规则的通配符匹配:
‘?’ 可以匹配任何单个字符。
'
’ 可以匹配任意字符序列(包括空字符序列)。
判定匹配成功的充要条件是:字符模式必须能够 完全匹配 输入字符串(而不是部分匹配)。

示例 1:

输入:s = “aa”, p = “a”
输出:false
解释:“a” 无法匹配 “aa” 整个字符串。
示例 2:

输入:s = “aa”, p = ""
输出:true
解释:'
’ 可以匹配任意字符串。
示例 3:

输入:s = “cb”, p = “?a”
输出:false
解释:‘?’ 可以匹配 ‘c’, 但第二个 ‘a’ 无法匹配 ‘b’。

提示:

0 <= s.length, p.length <= 2000
s 仅由小写英文字母组成
p 仅由小写英文字母、‘?’ 或 ‘*’ 组成

🌟 求解思路&实现代码&运行结果


⚡ 暴力法

🥦 求解思路

  1. 简单概括题目的意思:按照给定的规则[规则题目已经给规定好了],看字符串s是否可以匹配字符串p,如果可以的话,直接返回true,否则,返回false。
  2. 这个题目怎么求解呢,我们可以直接根据题的要求来找思路,首先,如果此时俩个位置对应的字符是相等的 或者 p位置对应的字符是’?‘,那么同时向后移动一个单位继续向后匹配;其次,如果p当前位置的字符是’*‘,那么此时可以俩种情况,第一种情况是p位置的’*‘匹配了s位置之前的字符,此时s可以继续向后判断,看看此时p位置的’*‘是否还可以继续判匹配,当然这个只是一种情况,还有一种情况就是当前的’*'只匹配s前的字符,,
  3. 有了基本的思路,接下来我们就来通过代码来实现一下。

🥦 实现代码

class Solution {
    public boolean isMatch(String s, String p) {
        char[] arr1=s.toCharArray();
        char[] arr2=p.toCharArray();
        return process(0,0,arr1,arr2);
    }

    public boolean process(int i,int j,char[] arr1,char[] arr2){
        if(i>=arr1.length&&j>=arr2.length){
            return true;
        }
        if(i>=arr1.length){
            while(j<arr2.length && arr2[j]=='*'){
                j++;
            }
            if(j<arr2.length) return false;
            else return true;
        }
        if(j>=arr2.length) return false;
        boolean flag=false;
        if(arr1[i]==arr2[j]||arr2[j]=='?'){
            flag|=process(i+1,j+1,arr1,arr2);
        }else if(arr2[j]=='*'){
            flag|=process(i+1,j,arr1,arr2)|process(i,j+1,arr1,arr2);
        }
        return flag;
    }
}

🥦 运行结果

暴力超出时间限制,我们继续更新改正!

在这里插入图片描述


⚡ 记忆化搜索

🥦 求解思路

  1. 因为在递归的过程中,会重复的出现一些多次计算的结果,我们通过开辟一个数组,将结果提前缓存下来,算过的直接返回,避免重复计算,通过空间来去换我们的时间。

🥦 实现代码

class Solution {

    int[][] dp;

    public boolean isMatch(String s, String p) {
        char[] arr1=s.toCharArray();
        char[] arr2=p.toCharArray();
        int m=arr1.length,n=arr2.length;
        dp=new int[m][n];
        for(int i=0;i<m;i++) Arrays.fill(dp[i],-1);
        return process(0,0,arr1,arr2);
    }

    public boolean process(int i,int j,char[] arr1,char[] arr2){
        if(i>=arr1.length&&j>=arr2.length){
            return true;
        }
        if(i>=arr1.length){
            while(j<arr2.length && arr2[j]=='*'){
                j++;
            }
            if(j<arr2.length) return false;
            else return true;
        }
        if(j>=arr2.length) return false;
        if(dp[i][j]!=-1) return dp[i][j]==1;
        boolean flag=false;
        if(arr1[i]==arr2[j]||arr2[j]=='?'){
            flag|=process(i+1,j+1,arr1,arr2);
        }else if(arr2[j]=='*'){
            flag|=process(i+1,j,arr1,arr2)|process(i,j+1,arr1,arr2);
        }
        dp[i][j]=flag?1:0;
        return flag;
    }
}

🥦 运行结果

通过缓存,将重复计算的结果缓存下来,通过。
时间情况
在这里插入图片描述

空间情况
在这里插入图片描述


⚡ 动态规划

🥦 求解思路

  1. 有了递归,有了记忆化搜索,接下来就是动态规划了,直接上手。

🥦 实现代码

class Solution {

    boolean[][] dp;

    public boolean isMatch(String s, String p) {
        char[] arr1=s.toCharArray();
        char[] arr2=p.toCharArray();
        int m=arr1.length,n=arr2.length;
        dp=new boolean[m+1][n+1];
        dp[m][n]=true;
        for(int j=n-1;j>=0;j--){
            if(arr2[j]=='*'){
                dp[m][j]=true;
            }else{
                break;
            }
        }
        for(int i=m-1;i>=0;i--){
            for(int j=n-1;j>=0;j--){
                boolean flag=false;
                if(arr1[i]==arr2[j]||arr2[j]=='?'){
                    flag|=dp[i+1][j+1];
                }else if(arr2[j]=='*'){
                    flag|=dp[i+1][j]|dp[i][j+1];
                }
                dp[i][j]=flag;
            }
        }
        return dp[0][0];
    }

}

🥦 运行结果

动态规划搞定,当然还是可以继续进行优化的,有很大的优化空间,大家可以积极的尝试。
时间复杂度
在这里插入图片描述
空间复杂度
在这里插入图片描述


💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

【Linux】线程详解之线程概念

前言 在我们的教材中&#xff0c;对线程给出以下的概念&#xff1a; 是进程内部的一个执行分支&#xff0c;在进程的内部运行&#xff0c;属于进程的一部分&#xff0c;比进程更加轻量化。 可能有的人看完之后都是懵的&#xff0c;什么叫在进程的内部运行&#xff0c;什么又是…

【正点原子STM32连载】 第十二章 SYSTEM文件夹介绍 摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第十二…

文件夹路径保存不同,什么批量修改名称

在日常工作中不知道大家有没有遇到过&#xff0c;需要批量修改文件夹名称&#xff0c;并且文件夹保存路径不同呢&#xff0c;像这种情况到底不能批量修改呢。我也问了很多身边的朋友&#xff0c;他们有的说&#xff0c;他一般都修改保存路径是同一个&#xff0c;还很少遇到像我…

【C++ STL】 趣学stackqueuepriority_queue【对话情景版】

文章目录 &#x1f4cd;前言C STL 之 stack&queue基础知识及其模拟实现&#x1f4cd;容器适配器&#x1f388;什么是适配器&#xff1f;&#x1f388;STL标准库中stack和queue的底层结构&#x1f388;deque的简单介绍(了解)&#x1f4cc;deque的原理介绍&#x1f4cc;deque…

强化学习:基本概念

以 grid-world 为例&#xff0c;进行强化学习基础概念的介绍。如图&#xff0c;机械人处于一个网格世界中&#xff0c;不同的网格代表不同的功能&#xff0c;白色代表机械人可以自由的进入&#xff0c;黄色代表陷阱&#xff08;机械人一旦进入就会被强制返回起点&#xff09;&a…

《Reinforcement Learning: An Introduction》第1章笔记

文章目录 1.1 强化学习1.2 强化学习的例子1.3 强化学习的要素1.4 局限和范围1.5 拓展例子&#xff1a;井字游戏1.6 总结1.7 强化学习的早期历史参考资料 1.1 强化学习 强化学习是学习做什么—如何将情景映射到动作—以便最大化数字奖励信号。学习者不会被告知该采取什么动作&a…

MySQL基础(三十九)MySQL常用命令

1 MySQL常用命令 1.1 mysql 该mysql不是指mysql服务&#xff0c;而是指mysql的客户端工具。 语法 &#xff1a; mysql [options] [database]1.1. 连接选项 #参数 &#xff1a; -u, --username 指定用户名 -p, --password[name] 指定密码 -h, --hostname 指定服务器IP或域名…

计算机组成原理实验报告二-认识汇编语言

实验资料&#xff1a; https://wwpv.lanzoue.com/b05drqjef 密码:d19t 使用txt文档编写下面C源码&#xff0c;文档命名为【学号_hello.c】并使用Mingw工具&#xff08;是 Minimalist GNU for Windows的缩写&#xff09;的bin文件夹下gcc.exe带选项编译&#xff08;&#xff09…

JUC之线程池的标准创建方式

文章目录 JUC之线程池的标准创建方式核心和最大线程数量空闲时长(keepAliveTime)线程工厂(ThreadFactory)任务阻塞队列线程池的拒绝策略线程池的任务调度流程 JUC之线程池的标准创建方式 ​ 因为使用Executors快捷创建线程池在使用时会有严重的潜在问题&#xff0c;因此在实战…

数据结构——队列的实现(细就完事了)

1.队列 1.1队列的概念和结构 今天我们要是实现的队列是完全相反的&#xff0c;队列是数据先进先出。而在栈中我们使用的顺序表(数组)来实现的。而队列却用单链表来实现是更加合适的。 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行数据操作的特殊线…

【王道·计算机网络】第六章 应用层【未完】

一、基本概念 1.1 应用层概述 应用层对应用程序的通信提供服务应用层协议定义&#xff1a; 应用进程交换的报文类型&#xff0c;请求还是响应?各种报文类型的语法&#xff0c;如报文中的各个字段及其详细描述字段的语义&#xff0c;即包含在字段中的信息的含义进程何时、如何…

这是关于“树先生“的故事

《数据结构专栏》 文章目录 《数据结构专栏》一、认识树结构如何遍历树如何创建一个树&#xff1f;如何判断一颗树是否是完全二叉树&#xff1f; 二、树的简单算法——递归1.相同树2.镜像树3.单值二叉树 总结 一、认识树结构 树的定义&#xff1a;树是指由N&#xff08;N>0…

高效研发团队都在看!一套方法论带你找到适合自己的效能提升路径

近日&#xff0c;ONES 受邀参加 2023 QECon 全球软件质量&效能大会&#xff08;深圳站&#xff09;。在会上&#xff0c;ONES 研发效能改进咨询顾问陈仪&#xff0c;发表了主题为《如何为研发团队打造专属的效能提升路径》的演讲。 陈仪有着丰富的咨询经验&#xff0c;曾带…

Netty核心技术二--BIO编程

1. I/O模型 I/O 模型简单的理解&#xff1a;就是用什么样的通道进行数据的发送和接收&#xff0c;很大程度上决定了程序通信的性能 Java共支持3种网络编程模型/IO模式&#xff1a;BIO、NIO、AIO Java BIO &#xff1a;同步并阻塞(传统阻塞型)&#xff0c;服务器实现模式为一个…

C++每日一练:饿龙咆哮-逃离城堡(避坑指南)非负整数求和

文章目录 前言一、题目二、解题代码及思路1、思路2、代码 三、非负整数求和总结 前言 饿龙这一题要说难度嘛&#xff0c;还真是挺简单的&#xff0c;但要满分也是有坑的&#xff01;本文就记录了笔者解题过程&#xff0c;希望能对读者使用C编程有所启发。至于非负整数求和代码…

RocketMQ集群环境部署

文章目录 1. 准备环境2. 修改主机名3. 免密登录配置4. 配置RocketMQ集群5. 搭建RocketMQ集群6. 启动集群 1. 准备环境 准备好三台虚拟机&#xff0c;下面是我的虚拟机的一些基本信息 名称ip地址worker010.117.33.135worker110.117.39.202worker210.117.9.52 三台虚拟机都已经…

Windows下nginx的配置与启动

一&#xff0c;下载 http://nginx.org/&#xff0c;打开官网&#xff0c;点击download 选择下载稳定版 二&#xff0c;解压 1&#xff0c;解压到硬盘某个目录 2&#xff0c;由于80端口被占用&#xff0c;于是我要修改conf目录下的nginx.conf文件 查看端口是否被占用 net…

路径规划算法:基于蝴蝶算法的路径规划算法- 附代码

路径规划算法&#xff1a;基于蝴蝶优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于蝴蝶优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法蝴蝶…

【C++】类和对象(上):带你速度了解什么是类,如何定义类!!

前言&#xff1a; 前面我们学习C一些基础的内容&#xff0c;也可以说C针对C语言的缺陷进行改进。而今天我们要学的是C的内容也就是类和对象。 一、初识类&#xff1a; 我们先来看看C语言解决一个问题的过程&#xff1a; 假设有以下这个场景&#xff1a;你需要手洗一件衣服&am…

算法Day09 | KMP,28. 实现 strStr() ,459.重复的子字符串

Day09 KMP28. 实现 strStr()459.重复的子字符串 KMP KMP是三个人人名缩写&#xff0c;用于在文本字符串text中搜索pattern字符串&#xff0c;返回在text中第一出现的位置。 算法做法就是在暴力匹配的基础上加速匹配。通过对pattern字符串求next数组(该数组也成为前缀表)&#…