从零学算法10

10.给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' '*' 的正则表达式匹配。
'.' 匹配任意单个字符
'*' 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。
示例 1:
输入:s = “aa”, p = “a”
输出:false
解释:“a” 无法匹配 “aa” 整个字符串。
示例 2:
输入:s = “aa”, p = “a*”
输出:true
解释:因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 ‘a’。因此,字符串 “aa” 可被视为 ‘a’ 重复了一次。
示例 3:
输入:s = "ab", p = ".*"
输出:true
解释:".*" 表示可匹配零个或多个('*')任意字符('.')

  • 首先基本情况就是:我们会想到同时遍历两个字符串,s 为被匹配字符串,p 为正则字符串,在匹配过程中 s 是不断往后遍历的,但 p 不一定,因为 * 和前面的字符组合可以表示多个字符。也就是说我们的匹配过程其实可以认为是不断看 s[:i] 和 p[:j] 是否匹配(python 语法,就是其实就是字符串前 i-1 位和前 j-1 位)
  • dp 的感觉是不是就来了,从 s[:1] 和 p[:1](即两个字符串的首位字符) 开始匹配,每次添加 s 或 p 的一个字符看是否匹配,最终得到两个完整字符串是否匹配。那么状态定义就来了,设 dp[i][j] 为 s 的前 i 个字符与 p 的前 j 个字符时候匹配。
  • 状态转移方程:因为 dp[0][0] 对应的是空字符,所以需要注意 dp[i][j] 对应的新添加的字符是 s[i - 1] 和 p[j - 1]。上面提到了,匹配过程唯一的变数其实就在 p,所以以它来划分情况,找到 dp[i][j] 和 dp[i-1][j] 或者 dp[i][j-1] 或者 dp[i-1][j-1] 的联系。dp[i][j] 对应的是 s[i-1] 和 p[j-1],我们唯一不确定的其实就是 p 中有没有 .*,并且其实 * 包含的情况更多,那么我们就把 . 划分到不包含 * 的情况中(这里说的包含不是整个字符,而是前一个状态是否包含,具体继续往下看)。
  • 要匹配的话,首先如果 p[j-1] 为 * ,以下三种情况 dp[i][j] 可以匹配成功:
    • dp[i][j-2] 为 true: 让 p[j-2] 的某个字符和 p[j-1] 的 * 组合为该字符出现 0 次,比如 aab*aa,跳过 b*
    • dp[i-1][j] && p[j-2] == s[i-1]:没加 s[i-1] 之前就匹配了,现在让 p[j-2] 和 p[j-1] 组合成s[i-1]*,即 p 包含一个或多个 s[i-1] ,比如 aaa 和 a* 的匹配
    • dp[i-1][j] && p[j-2] == '.':没加 s[i-1] 之前就匹配了,现在让 p[j-2] 和 p[j-1] 组合成.*,也等于 p 包含一个或多个 s[i-1] ,比如 aaa 和 .* 的匹配
  • 如果 p[j-1] 不为 *,以下两种情况能匹配成功:
    • dp[i-1][j-1] && p[j-1] == s[i-1]:除了新加的两个字符,之前都匹配,且新加的两个字符为同一个字符
    • dp[i-1][j-1] && p[j-1] == '.':除了新加的两个字符,之前都匹配,且新加的 p[j-1] 为任意字符 .
  •   public boolean isMatch(String s, String p) {int m=s.length()+1,n=p.length()+1;boolean[][] dp = new boolean[m][n];dp[0][0] = true;for(int j=2;j<n;j+=2)dp[0][j] = dp[0][j-2] && p.charAt(j - 1) == '*';for(int i = 1; i < m; i++) {for(int j = 1; j < n; j++) {if(p.charAt(j - 1) == '*') {if(dp[i][j - 2]) dp[i][j] = true; else if(dp[i - 1][j] && s.charAt(i - 1) == p.charAt(j - 2)) dp[i][j] = true;else if(dp[i - 1][j] && p.charAt(j - 2) == '.') dp[i][j] = true;} else {if(dp[i - 1][j - 1] && s.charAt(i - 1) == p.charAt(j - 1)) dp[i][j] = true;else if(dp[i - 1][j - 1] && p.charAt(j - 1) == '.') dp[i][j] = true;}}} return dp[m-1][n-1];}
    
  • 也可以简化成三元运算和与或运算
  •   public boolean isMatch(String s, String p) {int m = s.length() + 1, n = p.length() + 1;boolean[][] dp = new boolean[m][n];dp[0][0] = true;// 初始化首行for(int j = 2; j < n; j += 2)dp[0][j] = dp[0][j - 2] && p.charAt(j - 1) == '*';// 状态转移for(int i = 1; i < m; i++) {for(int j = 1; j < n; j++) {dp[i][j] = p.charAt(j - 1) == '*' ?dp[i][j - 2] || dp[i - 1][j] && (s.charAt(i - 1) == p.charAt(j - 2) || p.charAt(j - 2) == '.') :dp[i - 1][j - 1] && (p.charAt(j - 1) == '.' || s.charAt(i - 1) == p.charAt(j - 1));}}return dp[m - 1][n - 1];}
    

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

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

相关文章

Docker(2)——Docker镜像的基本命令

目录 一、简介 二、基本命令 1. Docker命令官方文档 2. 展示镜像 3. 搜索镜像 4. 下载镜像 5. 删除镜像 一、简介 本篇文章是Docker专栏的第二章&#xff0c;主要用于介绍Docker镜像的一些基本命令 二、基本命令 1. Docker命令官方文档 本篇博客仅记录常用的Docker镜…

LeetCode 2433. 找出前缀异或的原始数组【位运算,数组】1366

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

分布式理论和分布式锁知识点总结

文章目录 (一) 分布式理论算法和协议1&#xff09;CAP理论总结 2&#xff09;BASE理论BASE 理论的核心思想基本可用软状态最终一致性 3&#xff09;Paxos算法Basic Paxos 算法4&#xff09; Raft算法1 拜占庭将军 5&#xff09;Gossip协议 (二) 分布式锁分布式锁应该具备哪些条…

89 柱状图中最大的矩形

柱状图中最大的矩形 类似接雨水&#xff08;反过来&#xff0c;相当于找接雨水最少的一段&#xff09;题解1 暴力搜索&#xff08;超时&#xff09; O ( N 2 ) O(N^2) O(N2)另一种 题解2 单调栈【重点学习】常数优化 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的…

看完这个,别说你还找不到免费好用的配音软件

有很多小伙伴还在找配音工具&#xff0c;今天就给大家一次性分享四款免费好用的配音工具&#xff0c;每一个都经过测试&#xff0c;并且是我们自己也在用的免费配音工具 第一款&#xff0c;悦音配音工具 拥有强悍的AI智能配音技术&#xff0c;更专业&#xff0c;完美贴近真人配…

6. 一文快速学懂常用工具——GDB(下)

本章讲解知识点 GDB 调试 core 文件GDB 调试多线程本专栏适合于软件开发刚入职的学生或人士,有一定的编程基础,帮助大家快速掌握工作中必会的工具和指令。本专栏针对面试题答案进行了优化,尽量做到好记、言简意赅。如专栏内容有错漏,欢迎在评论区指出或私聊我更改,一起学习…

算法升级之路(六)

给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例 2: 输入: numRows 1 输出: [[1]] 解题思路&…

企业型多域名SSL证书怎么申请?有哪些流程?

随着越来越多的交流和交易发生在互联网上&#xff0c;保护敏感数据和建立用户信任成为企业的首要任务。HTTPS协议是一种关键的安全措施&#xff0c;用于保护数据传输的机密性和完整性。为了实施HTTPS&#xff0c;企业可以选择安装SSL证书。而对于需要保护多个域名的企业&#x…

Spring IOC - ConfigurationClassPostProcessor源码解析

上文提到Spring在Bean扫描过程中&#xff0c;会手动将5个Processor类注册到beanDefinitionMap中&#xff0c;其中ConfigurationClassPostProcessor就是本文将要讲解的内容&#xff0c;该类会在refresh()方法中通过调用invokeBeanFactoryPosstProcessors(beanFactory)被调用。 5…

php收发邮件的多种方法?

1、添加扩展&#xff1a; # 第一种&#xff1a; composer require php-imap/php-imap # 第二种&#xff1a; composer require phpmailer/phpmailer2、这里采用第二种方式&#xff1a; <?php declare(strict_types1);namespace App\Controller\v1\email;use App\Controll…

蓝牙服务:优化体验,提高连接效率

文章目录 1. 对蓝牙连接进行优化2. 设备配对的缓存机制3. 优化蓝牙连接的稳定性 蓝牙技术已经成为我们生活中不可或缺的一部分&#xff0c;我们使用它进行音频传输、数据传输、设备连接等等。然而&#xff0c;有时蓝牙连接会让用户感到非常困扰&#xff0c;比如连接速度缓慢、连…

【Android知识笔记】换肤专题

换肤其实也属于插件化专题的一个子话题,之所以单独拿出来,是因为它的处理方式比较特殊,相比插件化而言较简单一些。 系统内置的换肤功能支持 - Theme Android 系统中如果想修改应用的背景色,最简单的就是利用以下Theme相关的属性: 使用这些内置的属性可以实现一定程度上…

关于CMMI3.0评估的相关事宜

CMMI研究院发布了关于CMMI3.0评估的相关事宜&#xff0c;具体安排如下&#xff1a; 1、于2023年4月6日正式发布 CMMI 3.0。 2、于2023年第三季度&#xff08;7至9月&#xff09;计划确定具体方式和时间表&#xff0c;以获取CMMI3.0资质&#xff08;具体安排根据委员会确定&am…

计算机视觉的相机选型

#你一般什么时候会用到GPT?# 目前市面上的工业相机大多是基于CCD&#xff08;ChargeCoupled Device&#xff09;或CMOS&#xff08;Complementary Metal Oxide Semiconductor&#xff09;芯片的相机。一般CCD制造工艺更加复杂&#xff0c;也会更贵一点&#xff01; 1、CCD工…

Vue.js 之 透传 Attributes

Vue.js 之 透传 Attributes 1.Attributes 继承​2.对 class 和 style 的合并​3.v-on 监听器继承​4.深层组件继承​5.禁用 Attributes 继承​6.多根节点的 Attributes 继承​7.在 JavaScript 中访问透传 Attributes​ 1.Attributes 继承​ “透传 attribute”指的是传递给一个…

catkin build说明

与catkin_make不同&#xff0c;可以参考catkin build – Build Packages中文翻译版手册catkin build 默认会生成.private文件夹。链接时候可能出现失败的问题。catkin参数配置之软连接模式 改为如下模式即可 catkin init catkin config --merge-devel catkin buildBug Issue1…

django如何连接sqlite数据库?

目录 一、SQLite数据库简介 二、Django连接SQLite数据库 1、配置数据库 2、创建数据库表 三、使用Django ORM操作SQLite数据库 1、定义模型 2、创建对象 3、查询对象 总结 本文将深入探讨如何在Django框架中连接和使用SQLite数据库。我们将介绍SQLite数据库的特点&…

springboot知识点补充

系列文章目录 文章目录 系列文章目录前言一、springboot基础二、使用步骤1.引入库2.读入数据 前言 一、springboot基础 知识点补充 二、使用步骤 1.引入库 代码如下&#xff08;示例&#xff09;&#xff1a; import numpy as np import pandas as pd import matplotlib.pyp…

前端开发规范和注意点

*补救原则&#xff1a;出现异常时第一时间退出&#xff0c;并给出足够的提示错误信息。 *开发流程&#xff1a; *常规发布版本 常规发布版本频率为每月会有两个发布窗口&#xff08;一大一小&#xff1a;上半月小版本、下半月大版本&#xff09;。 例如2019年4月的常规发布版本…

k8spod

pod基本概念 (几种容器) pod 是k8s最小的创建和运行单元 一个pod包含几个容器&#xff0c;1个根容器/父容器/基础容器&#xff0c;一个或者多个应用容器/业务容器&#xff0c;pause容器 pod里面容器共享 network UTS IPC命令空间 k8s 创建的Pod 分为两种&#xff1a; 自主…