Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LeetCode-10.正则表达式匹配

LeetCode-10.正则表达式匹配

作者头像
悠扬前奏
修改于 2023-09-21 12:00:43
修改于 2023-09-21 12:00:43
59300
代码可运行
举报
运行总次数:0
代码可运行

题目

描述

给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'.' 匹配任意单个字符
'*' 匹配零个或多个前面的那一个元素

所谓匹配,是要涵盖整个字符串s的,而不是部分字符串。 说明:

  • s 可能为空,且只包含从 a-z 的小写字母。
  • p 可能为空,且只包含从 a-z 的小写字母,以及字符 .*

示例 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:
s = "aa"
p = "a"
输出: false
解释: "a" 无法匹配 "aa" 整个字符串。

示例 2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:
s = "aa"
p = "a*"
输出: true
解释: 因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。

示例 3:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:
s = "ab"
p = ".*"
输出: true
解释: ".*" 表示可匹配零个或多个('*')任意字符('.')。

示例 4:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:
s = "aab"
p = "c*a*b"
输出: true
解释: 因为 '*' 表示零个或多个,这里 'c'0, 'a' 被重复一次。因此可以匹配字符串 "aab"

示例 5:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:
s = "mississippi"
p = "mis*is*p*."
输出: false

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/regular-expression-matching 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解答

思路

使用动态规划的方法:

  1. 状态矩阵:dp[i][j] 表示s的前i个字符是否可以被p的前j个字符匹配.
  2. 转移方程: 2.1 如果p[j] == s[j],那么dp[i][j] = dp[i-1][j-1] 2.2 如果p[j] == '.',那么dp[i][j] = dp[i-1][j-1] 2.3 如果p[j] == '*': 2.3.1 如果p[j - 1] != s[i],那么dp[i][j] = dp[i][j-2] // 也就是说*匹配了个寂寞,让前面的字符无效了 2.3.2 如果p[j - 1] == s[i]或者p[j-1] == '.': - 要么dp[i][j] = dp[i-1][j] // * 匹配到了多个字符 - 要么dp[i][j] = dp[i][j-1] // * 匹配了一个字符 - 要么dp[i][j] = dp[i][j-2] // * 匹配了个寂寞

代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
    public boolean isMatch(String s, String p) {
        if (s == null || p == null) {
            return false;
        }
        int m = s.length(), n = p.length();
        boolean[][] dp = new boolean[m + 1][n + 1];
        dp[0][0] = true;
        // ""和匹配关系的初始化
        // 奇数位不管什么字符都是false,偶数位为*时,dp[0][i] = dp[0][i-2]
        for (int i = 2; i <= n; i += 2) {
            if (p.charAt(i - 1) == '*') {
                dp[0][i] = dp[0][i - 2];
            }
        }
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                char sc = s.charAt(i - 1);
                char pc = p.charAt(j - 1);
                if (sc == pc || pc == '.') {
                    dp[i][j] = dp[i - 1][j - 1];
                } else if (pc == '*') {
                    if (dp[i][j - 2]) {
                        dp[i][j] = true;
                    } else if (sc == p.charAt(j - 2) || p.charAt(j - 2) == '.') {
                        dp[i][j] = dp[i - 1][j];
                    }
                }
            }
        }
        return dp[m][n];
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LeetCode-面试题19-正则表达式匹配
给你一个字符串s和一个字符规律p,请你来实现一个支持 '.'和'*'的正则表达式匹配。
benym
2022/07/14
2000
LeetCode【10】-- 正则表达式匹配
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。
秦怀杂货店
2022/02/15
1.3K0
从0打卡leetcode之day11--正则表达式匹配
给定一个字符串 (s) 和一个字符模式 (p)。实现支持 ‘.’ 和 ‘*’ 的正则表达式匹配。
帅地
2018/10/09
6660
LeetCode 11:用递归和动规解决正则表达式匹配
给定一个字符串 (s) 和一个字符模式 (p)。实现支持 ‘.’ 和 ‘*’ 的正则表达式匹配。
帅地
2021/01/11
5070
LeetCode 11:用递归和动规解决正则表达式匹配
一天一大 leet(正则表达式匹配)难度:困难 DAY-20
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。
前端小书童
2020/09/24
2800
一天一大 leet(正则表达式匹配)难度:困难 DAY-20
LeetCode 09正则表达式匹配(递归VS动态规划)
这题刚开始见到,还以为遇到原题了,因为跟剑指offer的其中一题非常像,剑指offer第52题正则表达式,只不过那题给的两个char类型的数组,当时弱弱的用递归暴力过了。
bigsai
2020/08/21
4140
LeetCode 09正则表达式匹配(递归VS动态规划)
LeetCode 10. 正则表达式匹配(递归/DP)
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。
Michael阿明
2020/07/13
1.2K0
深度解析「正则表达式匹配」:从暴力解法到动态规划
今天分享的题目来源于 LeetCode 上第 10 号问题:正则表达式匹配。题目难度为 Hard,目前通过率为 23.9% 。
五分钟学算法
2019/08/01
6830
【力扣刷题】10. 正则表达式匹配
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。
jayjay
2022/11/02
2360
【力扣刷题】10. 正则表达式匹配
010. 正则表达式匹配 | Leetcode题解
给定一个字符串( s ) 和一个字符模式( p )。实现支持 '.' 和 '*' 的正则表达式匹配。
苏南
2020/12/16
2980
010. 正则表达式匹配 | Leetcode题解
【力扣算法03】之正则表达式匹配- python
首先, 创建一个二维数组dp,其中dp[i][j]表示字符串s的前i个字符与模式p的前j个字符是否匹配。 初始化dp[0][0]为True,因为空字符串与空模式是匹配的。 接下来, 需要填充数组dp的其他值。我们使用两个嵌套的循环来遍历字符串s和模式p的每个字符。 对于每个位置(i, j),我们考虑几种情况:
全栈若城
2024/02/29
1610
【力扣算法03】之正则表达式匹配- python
LeetCode 0010. 正则表达式匹配[动态规划详解]
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。
Yano_nankai
2021/03/02
3040
LeetCode 0010. 正则表达式匹配[动态规划详解]
动态规划 10.正则表达式匹配
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。
MashiroT
2023/01/30
2700
golang刷leetcode动态规划(6)正则表达式
给定一个字符串 (s) 和一个字符模式 (p)。实现支持 '.' 和 '*' 的正则表达式匹配。
golangLeetcode
2022/08/02
2310
LeetCode - #10 正则表达式匹配(Top 100)
已知一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。
Swift社区
2021/12/06
3620
【动态规划篇】正则表达式与通配符:开启代码匹配的赛博奇幻之旅
这里我们做过一些动归的题目就很容易想到是字符串两个数组的dp问题了;如果没头绪可以做一做力扣的最长公共子序列问题(传送门:1143. 最长公共子序列 - 力扣(LeetCode));就懂啦,这里就先不做解释了。
羑悻的小杀马特.
2025/02/04
1230
【动态规划篇】正则表达式与通配符:开启代码匹配的赛博奇幻之旅
【LeetCode】正则表达式匹配(动态规划)
给定一个字符串 (s) 和一个字符模式 (p)。实现支持 '.' 和 '*' 的正则表达式匹配。
弗兰克的猫
2019/05/25
9940
​LeetCode刷题实战10:字符串正则匹配
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2021/01/19
4450
LeetCode 刷题记录(二)
如果执行环境只能存储得下 32 位有符号整数,那么其数值范围为 (最高位为符号位),翻转时如果溢出请返回 0。
口仆
2020/08/16
4890
剑指Offer(五十二)-- 正则表达式匹配(动态规划)
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
秦怀杂货店
2022/02/15
3540
剑指Offer(五十二)-- 正则表达式匹配(动态规划)
推荐阅读
相关推荐
LeetCode-面试题19-正则表达式匹配
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验