千家信息网

LeetCode如何解决正则表达式匹配问题

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍了LeetCode如何解决正则表达式匹配问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。题目请实现一个函数用来匹配包
千家信息网最后更新 2026年10月31日LeetCode如何解决正则表达式匹配问题

这篇文章主要介绍了LeetCode如何解决正则表达式匹配问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

题目

请实现一个函数用来匹配包含'. '和''的正则表达式。模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但与"aa.a"和"ab*a"均不匹配。

示例 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*."输出: falses 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母以及字符 . 和 *,无连续的 '*'。
思路
  • 如果 BB 的最后一个字符是正常字符,那就是看 A[n-1] 是否等于 B[m-1],相等则看 A_{0..n-2}与 B_{0..m-2} ,不等则是不能匹配,这就是子问题。

  • 如果 BB 的最后一个字符是'.',它能匹配任意字符,直接看 A_{0..n-2}与 B_{0..m-2}

  • 如果 B 的最后一个字符是'',它代表 B[m-2]=c 可以重复0次或多次,它们是一个整体 c

    • 情况一:A[n-1] 是 0 个 c,B 最后两个字符废了,能否匹配取决于 A_{0..n-1}和 B_{0..m-3}是否匹配

    • 情况二:A[n-1] 是多个 c 中的最后一个(这种情况必须 A[n-1]=c 或者 c='.'),所以 A 匹配完往前挪一个,B继续匹配,因为可以匹配多个,继续看 A_{0..n-2}和 B_{0..m-1}是否匹配。

代码
class Solution {    public boolean isMatch(String s, String p) {        int n = s.length(), m = p.length();        boolean[][] f = new boolean[n+1][m+1];        for(int i = 0; i <= n; i++){            for(int j = 0; j <= m; j++){                if(j == 0){                    f[i][j] = i == 0;                }else{ //非空正则                    if(p.charAt(j-1) != '*'){ //非*                        if(i > 0 && (s.charAt(i-1) == p.charAt(j-1) || p.charAt(j-1) == '.')){                            f[i][j] = f[i-1][j-1];                        }                    }else{ //*                        if(j >= 2){                            f[i][j] |= f[i][j-2];                         }                        if(i >= 1 && j >= 2 && (s.charAt(i-1) == p.charAt(j-2) || p.charAt(j-2) == '.')){                            f[i][j] |= f[i-1][j];                        }                    }                }            }        }        return f[n][m];    }}

感谢你能够认真阅读完这篇文章,希望小编分享的"LeetCode如何解决正则表达式匹配问题"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

字符 多个 字符串 示例 输入 输出 篇文章 解释 正则 表达式 问题 就是 情况 模式 代表 元素 字母 小写 两个 代码 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 河南云网互联网络科技有限公司 互联网科技巨头监管 科技创新与互联网经济 科技互联网公司装修 金融科技 互联网金融 杭州互联网科技公司 互联网科技视频 狮子座互联网科技有限公司 北京禾田雨橡互联网科技 科技互联网创业计划书 互联网科技有限公司 翻译 华中科技有哪些互联网大佬 卫星互联网科技股票 高科技互联网发展前景如何 长沙茂晟互联网科技有限公司 山东大美朱楼互联网科技有限公司 上海同邻互联网科技有限公司规模 广州梦谷互联网科技有限公司领导 江苏互联网智能科技产品出厂价 互联网科技企业文化 瑰夏咖啡 米客互联网科技 互联网科技小额贷款 天速互联网络科技有限公司 随着互联网科技发展 中国互联网公司排名锤子科技 山东子淼互联网科技有限公司 广州百诚互联网科技有限公司官网 半导体行业属于互联网高科技类吗 保山互联网科技靠谱吗
0