LeetCode-44-通配符匹配

news2025/4/18 21:57:17

在这里插入图片描述

1、递归

具体思路同LeetCode-剑指19-正则表达式匹配,但在本题中由于字符串长度过长会导致超时。

在这里插入代码片class Solution {
public:
    bool isMatch(string s, string p) {
        if (p.empty()) return s.empty();
        bool first_match = !s.empty() && (s[0] == p[0] || p[0] == '?' || p[0] == '*');
        if (p[0] == '*') {
            return (first_match && isMatch(s.substr(1), p)) || isMatch(s, p.substr(1));
        } else {
            return first_match && isMatch(s.substr(1), p.substr(1));
        }
    }
};

2、动态规划法

我们可以利用二维数组 d p [ i ] [ j ] dp[i][j] dp[i][j]来表示字符串 s s s的前 i i i位与字符串 p p p的前 j j j位的匹配情况。我们首先需要对二维数组进行初始化,其中 d p [ 0 ] [ 0 ] = t r u e dp[0][0] = true dp[0][0]=true,当字符串 p p p的前 j j j位均为 “ ∗ ” “*” 时同样 d p dp dp值为 t r u e true true。而后我们进行循环:1、若 p [ j − 1 ] = = ′ ? ′ 或 s [ i − 1 ] = = p [ j − 1 ] p[j - 1] == '?' 或 s[i - 1] == p[j - 1] p[j1]==?s[i1]==p[j1],说明此时这一位上两个字符串是匹配的,故具体的值取决于此前的字符串是否匹配;2、若 p [ j − 1 ] = = ′ ∗ ′ p[j - 1] == '*' p[j1]==,说明此时可能出现两种情况,一是 “ ∗ ” “*” 匹配空字符串,故此时的状态与 d p [ i ] [ j − 1 ] dp[i][j - 1] dp[i][j1]相同,二是 “ ∗ ” “*” 匹配任意一个字符,此时的状态与 d p [ i − 1 ] [ j ] dp[i - 1][j] dp[i1][j]的状态相同。

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

3、贪心算法

我们可以将字符串 p p p认为是可以根据 “ ∗ ” “*” 分割后的多个字符串,若在原来的字符串 s s s中包含这些字符串则说明两个字符串是匹配的。在此我们还需要考虑两种特殊情况:1、字符串 p p p不以 “ ∗ ” “*” 作为结尾,此时我们可以先从后向前进行遍历直至以 “ ∗ ” “*” 作为结尾;2、字符串 p p p不以 “ ∗ ” “*” 作为开头,此时我们利用 s R e c o r d sRecord sRecord t R e c o r d tRecord tRecord标记为-1表示不能继续重新匹配。

class Solution {
public:
    bool isMatch(string s, string p) {
        auto allStars = [](const string& str, int left, int right) {
            for (int i = left; i < right; ++i) {
                if (str[i] != '*') {
                    return false;
                }
            }
            return true;
        };
        auto charMatch = [](char u, char v) {
            return u == v || v == '?';
        };

        while (s.size() && p.size() && p.back() != '*') {
            if (charMatch(s.back(), p.back())) {
                s.pop_back();
                p.pop_back();
            }
            else {
                return false;
            }
        }
        if (p.empty()) {
            return s.empty();
        }

        int sIndex = 0, pIndex = 0;
        int sRecord = -1, pRecord = -1;
        while (sIndex < s.size() && pIndex < p.size()) {
            if (p[pIndex] == '*') {
                ++pIndex;
                sRecord = sIndex;
                pRecord = pIndex;
            }
            else if (charMatch(s[sIndex], p[pIndex])) {
                ++sIndex;
                ++pIndex;
            }
            else if (sRecord != -1 && sRecord + 1 < s.size()) {
                ++sRecord;
                sIndex = sRecord;
                pIndex = pRecord;
            }
            else {
                return false;
            }
        }
        return allStars(p, pIndex, p.size());
    }
};

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

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

相关文章

Gradle修改镜像库 ,初始启动配置 init.gradle

目录 ■前言 ■代码放置位置 ■具体代码 代码建议&#xff1a; ■Gradle 的 更多知识&#xff08;私密&#xff09; ■前言 默认镜像库太慢了&#xff0c;在【初始启动配置&#xff08;init.d&#xff09;】中&#xff0c;添加xxx.gradle (init.gradle) 文件&#xff0c;指…

网络自动化运维(NetDevOps)创作者推荐

前言&#xff1a; 随着NetDevOps技术登上了历史舞台&#xff0c;越来越多的从业者开始利用NetDevOps简化网络的运维&#xff0c;并进行了技术分享&#xff0c;将蛋糕越做越大。在这里&#xff0c;仅代表个人对这些无私奉献的网络、运维工程师们表达由衷的敬意。 此外&#xff…

用户身份验证的令牌—Token教程

一、什么是Token&#xff1f; 1、Token的引入&#xff1a;Token是在客户端频繁向服务端请求数据&#xff0c;服务端频繁的去数据库查询用户名和密码并进行对比&#xff0c;判断用户名和密码正确与否&#xff0c;并作出相应提示&#xff0c;在这样的背景下&#xff0c;Token便应…

学习二十大奋进新征程线上知识答题小程序登录技术点分析与实现

学习二十大奋进新征程线上知识答题小程序登录技术点分析与实现 在最新搭建的知识答题小程序&#xff0c;遇到了微信授权登录上的技术难点&#xff0c;所以对于以往的那套登录框架不能使用了&#xff0c;需要搭建一套新的注册登录流程框架。 不得不做出调整&#xff0c;为此&a…

json交叉编译并移植到嵌入式开发板

1、解压&#xff1a;tar -xvf json-c-0.9.tar.gz 默认解压在当前目录 2、进入解压后的目录&#xff1a;$ cd cd json-c-0.9/ 3、执行&#xff1a; sudo ./configure CCaarch64-linux-gnu-gcc --hostarm-linux --prefix/opt/json-c-0.9/ 说明&#xff1a;CC赋值为嵌入式开发环…

Java之线程详解(二)——线程安全概述、synchronized锁

一、线程安全概述 什么是线程安全问题&#xff1f; 当多个线程共享同一个全局变量&#xff0c;做写的操作时&#xff08;即修改该全局变量&#xff09;&#xff0c;可能会受到其他的线程干扰&#xff0c;发生线程安全问题。 eg&#xff1a; public class Thread01 implemen…

丝裂原活化蛋白激酶TaMPK3抑制植物对ABA的反应

文章信息 题目&#xff1a;Mitogen-activated protein kinase TaMPK3 suppresses ABA response by destabilising TaPYL4 receptor in wheat 刊名&#xff1a;New Phytologist 作者&#xff1a;Ying Liu&#xff0c;You-Zhi Ma, Zhao-Shi Xu et al. 单位&#xff1a;Instit…

【Linux】如何在Linux下提交代码到gittee

文章目录使用 git 命令行创建项目三板斧第一招: git add三板斧第二招: git commit三板斧第三招: git push其他几个重要的命令git pull&#xff08;将远端同步到本地&#xff09;git rm&#xff08;删除&#xff09;git log&#xff08;查看提交日志&#xff09;使用 git 命令行…

GPT语言模型

GPT&#xff1a;GPT采用了大量的无监督的数据进行预训练&#xff08;Pre-training&#xff09;&#xff0c;并在有监督的数据上进行微调&#xff08;Fine-tuning&#xff09;来做具体的NLP的任务。结构&#xff1a;GPT使用了12层12头&#xff0c;单向transformer的decoder部分&…

2001-2020年全国31省城镇居民人均可支配收入/居民实际收入水平

1、时间区间为&#xff1a;2001-2020年 2、范围包括&#xff1a;全国31省 3、基期&#xff1a;以2001年为基期 4、来源&#xff1a;国家统计J 5、指标包括&#xff1a; 城市居民消费价格指数(上年100)、城镇居民人均可支配收入(元)、实际可支配收入&#xff08;2001年为基…

LabVIEW开发LabVIEW类

LabVIEW开发LabVIEW类 从概念上来说&#xff0c;LabVIEW面向对象编程和其它面向对象编程语言相似。但由于LabVIEW是数据流图形化编程环境&#xff0c;LabVIEW对类数据的操作和交互&#xff0c;以及LabVIEW类代码的调试方法和其它语言有所不同。 LabVIEW中的对象由值来传递&a…

02【SpringMVC的工作流程】

文章目录二、SpringMVC的工作流程2.1 SpringMVC的三大组件2.1.1 HandlerMapping&#xff1a;2.1.2 HandlerAdapter&#xff1a;2.1.3 ViewResolver&#xff1a;2.2 SpringMVC源码分析2.2.1 准备工作2.2.2 查看DispatcherServlet的继承体系&#xff1a;2.2.3 通过映射器获取执行…

工业机械设备设计与艺术设计

众所周知&#xff0c;外观设计是目前工业设计的一种&#xff0c;也是展示产品外观性能的最佳途径。如果外观设计做得好&#xff0c;产品可以在第一时间吸引顾客。说到外观设计&#xff0c;我们不得不说&#xff0c;工业机械的外观设计&#xff0c;因为机械工业是工业设计的主要…

Java客户关系系统(含源码+论文+答辩PPT等)

该项目采用技术Struts2代理注解反射MyBatisjqueryjscss等技术&#xff0c;项目含有源码、文档、配套开发软件、软件安装教程、项目发布教程等 项目功能介绍&#xff1a; 系统管理&#xff1a;用户登录、用户退出 员工管理&#xff1a;主要实现对员工的增、删、查、改功能 客户信…

ZMQ之面向服务的可靠队列(管家模式)

管家模式协议&#xff08;MDP&#xff09;在扩展PPP协议时引入了一个有趣的特性&#xff1a;client发送的每一个请求都有一个“服务名称”&#xff0c;而worker在像队列装置注册时需要告知自己的服务类型。MDP的优势在于它来源于现实编程&#xff0c;协议简单&#xff0c;且容易…

孩子到底是食物过敏?还是食物不耐受?

虾蟹过敏&#xff0c;牛奶过敏&#xff0c;鸡蛋过敏&#xff0c;甚至花生过敏……近年来&#xff0c;儿童食物过敏的发病率逐年上升。食物过敏对儿童危害很大&#xff0c;其临床症状会使儿童患病&#xff0c;影响身心健康&#xff1b;长期禁食&#xff0c;影响均衡营养摄入&…

Segger RTT深度使用说明-移植-Jlink rtt viewer显示-输出到Secure CRT

简介 RTT&#xff08; Real Time Terminal&#xff09;是SEGGER公司新出的可以在嵌入式应用中与用户进行交互的实时终端。J-Link驱动4.90之后的版本都支持RTT。RTT既可以从MCU上输出信息、也可以向应用程序发送信息&#xff0c;由于其高速的特性&#xff0c;所以不影响MCU的实…

重磅消息:Lazada和Shopee通过中国执照就可以开通本地店铺,享受更多的流量和资源扶持

目前Lazada平台是可以做跨境店和本地店铺的&#xff0c;跨境店铺指的是中国卖家通过国内的营业执照开店&#xff0c;本地店指的是东南亚本地的商家提供个人身份证或当地的营业执照开的店铺&#xff0c;那么有什么区别和优劣势 1.跨境店/本地店开店所需资料 跨境店&#xff1a…

横向的Excel输出为pdf自动分成两页怎么办?不分页,铺满整张纸的方法来了

我们工作中有时候会需要把Excel转换成pdf&#xff0c;一般我们用WPS的“输出为pdf”功能就可以转了。但是有些横向的Excel转换的时候&#xff0c;会自动分成两页&#xff0c;这并不是我们想要的效果。怎么才能不分成两页呢&#xff1f; 首先我们有一个Excel&#xff1a; 使用…

什么牌子蓝牙耳机通话质量好?通话质量好的蓝牙耳机推荐

蓝牙耳机作为手机的最佳伴侣&#xff0c;已经成为老百姓日常生活必备。每次有大品牌发布新款蓝牙耳机&#xff0c;几乎都能够得到很好的反响&#xff0c;蓝牙耳机不仅在音质上有了很大的提升&#xff0c;并且在其他功能也在不断的提升&#xff0c;使用蓝牙耳机通话避免不了电话…