刻意练习:LeetCode实战 -- Task18. 正则表达式匹配
背景
本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式,即选择了五个知识点(数组、链表、字符串、树、贪心算法),每个知识点选择了 三个简单、两个中等、一个困难 等级的题目,共计三十道题,利用三十天的时间完成这组刻意练习。
本次任务的知识点:字符串
字符串或串(string) 是由数字、字母、下划线组成的一串字符。一般记为 s = “a1a2...an”(n >= 0)
。它是编程语言中表示文本的数据类型。
通常以串的整体作为操作对象,如:在串中查找某个子串在该串中首次出现的位置、在串的某个位置上插入一个子串以及删除一个子串等。两个字符串相等的充要条件是:长度相等,并且各个对应位置上的字符都相等。串通常以顺序的方式进行存储与实现。
题目
- 题号:10
- 难度:困难
- https://leetcode-cn.com/problems/regular-expression-matching/
给你一个字符串s
和一个字符规律p
,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。
'.' 匹配任意单个字符
'*' 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串s
的,而不是部分字符串。
说明:
s
可能为空,且只包含从 a-z 的小写字母。p
可能为空,且只包含从 a-z 的小写字母,以及字符 ‘.’ 和 ‘*’。
示例 1:
输入:
s = "aa"
p = "a"
输出: false
解释: "a" 无法匹配 "aa" 整个字符串。
示例 2:
输入:
s = "aa"
p = "a*"
输出: true
解释: 因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。
示例 3:
输入:
s = "ab"
p = ".*"
输出: true
解释: ".*" 表示可匹配零个或多个('*')任意字符('.')。
示例 4:
输入:
s = "aab"
p = "c*a*b"
输出: true
解释: 因为 '*' 表示零个或多个,这里 'c' 为 0 个, 'a' 被重复一次。因此可以匹配字符串 "aab"。
示例 5:
输入:
s = "mississippi"
p = "mis*is*p*."
输出: false
实现
第一种:回溯法
思路:这种匹配思路其实就是不断地减掉s
和p
的可以匹配首部,直至一个或两个字符串被减为空的时候,根据最终情况来得出结论。
如果只是两个普通字符串进行匹配,按序遍历比较即可:
if (s[i] == p[i])
如果正则表达式字符串p只有一种"."一种特殊标记,依然是按序遍历比较即可 :
if (s[i] == p[i] || p[i] == '.')
上述两种情况实现时还需要判断字符串长度和字符串判空的操作。
但是,"*"这个特殊字符需要特殊处理,当p的第i个元素的下一个元素是星号时会有两种情况:
i
元素需要出现0次,我们就保持s
不变,将p
的减掉两个元素,调用IsMatch
。例如s:bc、p:a*bc
,我们就保持s
不变,减掉p
的"a*",调用IsMatch(s:bc,p:bc)
。i
元素需要出现一次或更多次,先比较i
元素和s
首元素,相等则保持p
不变,s
减掉首元素,调用IsMatch
。例如s:aabb、p:a*bb
,就保持p
不变,减掉s
的首元素,调用IsMatch(s:abb,p:a*bb)
。
此时存在一些需要思考的情况,例如s:abb、p:a*abb
,会用两种方式处理:
- 按照上述第二种情况比较
i
元素和s
首元素,发现相等就会减掉s
的首字符,调用IsMatch(s:bb,p:a*abb)
。在按照上述第一种情况减去p
的两个元素,调用IsMatch(s:bb,p:abb)
,最终导致false
。 - 直接按照上述第一种情况减去
p
的两个元素,调用IsMatch(s:abb,p:abb)
,最终导致true
。
所以说这算是一种暴力方法,会将所有的情况走一边,看看是否存在可以匹配的情况。
- 执行结果:通过
- 执行用时:768 ms, 在所有 C# 提交中击败了 10.69% 的用户
- 内存消耗:25.6 MB, 在所有 C# 提交中击败了 5.00% 的用户
public class Solution
{public bool IsMatch(string s, string p){//若正则串p为空串,则s为空串匹配成功,s不为空串匹配失败。if (string.IsNullOrEmpty(p))return string.IsNullOrEmpty(s) ? true : false;//判断s和p的首字符是否匹配,注意要先判断s不为空bool headMatched = string.IsNullOrEmpty(s) == false&& (s[0] == p[0] || p[0] == '.');if (p.Length >= 2 && p[1] == '*'){//如果p的第一个元素的下一个元素是*,则分别对两种情况进行判断return IsMatch(s, p.Substring(2)) ||(headMatched && IsMatch(s.Substring(1), p));}else if (headMatched){//否则,如果s和p的首字符相等return IsMatch(s.Substring(1), p.Substring(1));}else{return false;}}
}
Python 语言
- 执行结果:通过
- 执行用时:1940 ms, 在所有 Python3 提交中击败了 6.96% 的用户
- 内存消耗:13.6 MB, 在所有 Python3 提交中击败了 5.06% 的用户
class Solution:def isMatch(self, s: str, p: str) -> bool:if len(p) == 0:return True if len(s) == 0 else FalseheadMatched = len(s) != 0 and (s[0] == p[0] or p[0] == '.')if len(p) >= 2 and p[1] == '*':return self.isMatch(s, p[2:]) or (headMatched and self.isMatch(s[1:], p)) elif headMatched == True:return self.isMatch(s[1:], p[1:])else:return False
往期活动
LSGO软件技术团队会定期开展提升编程技能的刻意练习活动,希望大家能够参与进来一起刻意练习,一起学习进步!
- Python基础刻意练习活动即将开启,你参加吗?
- Task01:变量、运算符与数据类型
- Task02:条件与循环
- Task03:列表与元组
- Task04:字符串与序列
- Task05:函数与Lambda表达式
- Task06:字典与集合
- Task07:文件与文件系统
- Task08:异常处理
- Task09:else 与 with 语句
- Task10:类与对象
- Task11:魔法方法
- Task12:模块
我是 终身学习者“老马”,一个长期践行“结伴式学习”理念的 中年大叔。
我崇尚分享,渴望成长,于2010年创立了“LSGO软件技术团队”,并加入了国内著名的开源组织“Datawhale”,也是“Dre@mtech”、“智能机器人研究中心”和“大数据与哲学社会科学实验室”的一员。
愿我们一起学习,一起进步,相互陪伴,共同成长。
后台回复「搜搜搜」,随机获取电子资源!
欢迎关注,请扫描二维码:
相关文章:

CentOS7启动图形界面
1.yum groupinstall "GNOME Desktop" -y 2.systemctl get-default 3.systemctl set-default graphical.target 4.systemctl get-default 5.reboot

Java培训学习步骤有哪些
最近几年,有很多学习java技术的同学都有过半途而废的想法,认为java零基础是很难学会的,其实出现这样的问题,最主要的原因就是学习方法有问题,下面小编整理的Java培训学习步骤,希望能够帮助大家更有效的学习…

extjs 4 tab panel得strip在IE下右偏解决办法
这是受 align"center" 影响造成的转载于:https://www.cnblogs.com/rav009/archive/2011/12/31/5131240.html

Vbox共享文件夹不显示了
博主之前装的虚拟机没啥问题,按部就班,打开“我的电脑”可以看到主机上的共享文件夹,最近重装了一波,各种问题就来了,包括共享文件夹设置好后,看不见了。 介绍比较麻烦的方案,就是打开“我的电脑…

刻意练习:LeetCode实战 -- Task19. 相同的树
背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式,即选择了五个知识点(数组、链表、字符串、树、贪心算法),每个知识点选择了…

找Java培训机构需要注意那些
java技术在互联网行业已经是众所周知的一个编程热门技术,市面上也出现了很多java培训机构,那么想要找到一个适合自己且比较专业的java培训机构应该注意哪些呢?下面小编就为大家详细的介绍一下找Java培训机构需要注意那些? 找Java培训机构需要…

字符串的最大相似匹配
字符串的最大相似匹配计划中,kmp完后,本篇继续。。。转载于:https://www.cnblogs.com/springmvc-hibernate/archive/2011/12/31/2484048.html

刻意练习:LeetCode实战 -- Task20. 对称二叉树
背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式,即选择了五个知识点(数组、链表、字符串、树、贪心算法),每个知识点选择了…

洛谷 P1598 垂直柱状图【字符串+模拟】
P1598 垂直柱状图 题目描述 写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过72个字符),然后用柱状图输出每个字符在输入文件中出现的次数。严格地按照输出样例来安排你的输出格式。 输入输出格式 输入格式&…

java开发培训中消息中间件的优势有哪些
系统解耦 交互系统之间没有直接的调用关系,只是通过消息传输,故系统侵入性不强,耦合度低。 提高系统响应时间 例如原来的一套逻辑,完成支付可能涉及先修改订单状态、计算会员积分、通知物流配送几个逻辑才能完成;通过MQ 架构设计&…

UIView 的 autoresizingMask 属性 详解。
在 UIView 中有一个autoresizingMask的属性,它对应的是一个枚举的值(如下),属性的意思就是自动调整子控件与父控件中间的位置,宽高。 enum { UIViewAutoresizingNone 0, UIViewAutoresizingFle…

刻意练习:LeetCode实战 -- Task21. 二叉树的最大深度
背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式,即选择了五个知识点(数组、链表、字符串、树、贪心算法),每个知识点选择了…

spring中@value注解需要注意
转自:https://blog.csdn.net/qiuhan/article/details/47089329 首先,value需要参数,这里参数可以是两种形式:Value("#{configProperties[t1.msgname]}")或者Value("${t1.msgname}"); 其次…

学Java需要用到的软件快收藏!
java编程语言学起来是比较繁琐的,很多java工程师不管是工作还是学习,都会用到一些辅助工具,对于想要学习java技术的人来说,利用java辅助软件学习会比较更有效率,下面小编就为大家一一整理一下学Java需要用到的软件有哪…

刻意练习:LeetCode实战 -- Task22. 二叉树的中序遍历
背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式,即选择了五个知识点(数组、链表、字符串、树、贪心算法),每个知识点选择了…

Oracle round函数是什么意思?怎么运用?
如何使用 Oracle Round 函数 (四舍五入) 描述 : 传回一个数值,该数值是按照指定的小数位元数进行四舍五入运算的结果。 SELECT ROUND( number, [ decimal_places ] ) FROM DUAL 参数: number : 欲处理之数值 decimal_places : 四舍五入 , 小数取几位 ( 预设为 0 ) S…

Spring MVC前后端的数据传输
本篇文章主要介绍了Spring MVC中如何在前后端传输数据。 后端 ➡ 前端 在Spring MVC中这主要通过Model将数据从后端传送到前端,一般的写法为: RequestMapping(value "/index", method RequestMethod.POST) public String index(Model model)…

参加java培训,要避免这几个误区!
java技术在近几年学习的人越来越多,小编在这里提醒同学们,想要学好java技术,除了报班系统培训之外,还要找到适合自己的学习方法,以下几点误区同学们一定要避免! 参加java培训,要避免这几个误区! 1…

SQL优化整理。
其实SQL能力很差劲,简单查询还成,复杂查询以及优化,基本脑子里没有概念。了解一下概念,然后打算找本理论书好好看看。 先到处找了些优化的sql,整理出来,记录一下。1、对查询进行优化,应尽量避免…

PHP开发框架之YII框架学习——碾压ThinkPHP不是梦
前 言 JRedu 程序猿是一种慵懒的生物!能少敲一行代码,绝对不会多敲一个字符!所以,越来越多的开发框架应运而生,在帮助我们完成功能的同时,极大程度上也帮我们节省了人力物力,而且也提高了系统的…

刻意练习:LeetCode实战 -- 二叉树的前序遍历
背景 今天,第二期基础算法(Leetcode)刻意练习训练营 的打卡任务是二叉树的中序遍历,由于二叉树的遍历方式通常来说有四种:前序遍历、中序遍历、后序遍历以及层次遍历,而LeetCode也有二叉树的前序遍历题目&…

接口测试要如何做数据准备
数据准备是接口测试过程中不可或缺的一步,也是花费时间很长的工作,因为程序的功能就是处理数据。那么在接口测试中,我们要怎样来准备数据呢?小编整理了以下一些关于数据准备的方法,希望对大家能有所帮助。 数据准备分为两种类型&…

刻意练习:LeetCode实战 -- 二叉树的后序遍历
背景 今天,第二期基础算法(Leetcode)刻意练习训练营 的打卡任务是二叉树的中序遍历,由于二叉树的遍历方式通常来说有四种:前序遍历、中序遍历、后序遍历以及层次遍历,而LeetCode也有二叉树的后序遍历题目&…

数据库加锁(转)
1 如何锁一个表的某一行 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SELECT * FROM table ROWLOCK WHERE id 1 2 锁定数据库的一个表 SELECT * FROM table WITH (HOLDLOCK) 加锁语句: sybase: update 表 set col1col1 where 10 ; MSSQL: select col1 from …

学好web前端开发要注意哪些问题
web前端学起来是比较困难的,当然想要学好web前端技术,那么有一些注意事项一定是要看的,下面小编就为大家详细的介绍一下学好web前端开发要注意哪些问题? 学好web前端开发要注意哪些问题? 基础:无论做什么都一定要有扎实的…

Android include 标签
android中include标签是为了便于控件的覆用的一个很好解决方案。 但是也有一些需要注意的地方,下面是本人在项目中碰到过的一个问题,做此记录,便于以后查看。 include标签用法。 1.新建一个xml文件,命名 head.xml head.xml文件内容…

刻意练习:LeetCode实战 -- 不同的二叉搜索树
背景 今天,第二期基础算法(Leetcode)刻意练习训练营 的打卡任务是“不同的二叉搜索树 II”,而LeetCode也有“不同的二叉搜索树”题目,故一起写了。 题目 题号:96难度:中等https://leetcode-cn.…

15. Python 函数
1. 函数的写法,函数的调用【函数的一般形式】定义一个函数要有以下规则:(1)函数代码块以 def 关键词开头,后接函数标识符名称和小括号();(2)任何传入参数和自…

Java培训找什么样的机构比较好
Java培训找什么样的机构比较好?很多人都比较关注java技术,想要学习java技术,参加相关工作,但如今市面上的java培训机构那么多,怎么样选择比较靠谱呢?来看看下面的详细介绍吧。 Java培训找什么样的机构比较好?小编这里…

刻意练习:LeetCode实战 -- Task23. 不同的二叉搜索树 II
背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式,即选择了五个知识点(数组、链表、字符串、树、贪心算法),每个知识点选择了…