当前位置: 首页 > news >正文

【动态规划】LeetCode-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
解释:".*" 表示可匹配零个或多个('*')任意字符('.')。

提示:

1 <= s.length <= 20
1 <= p.length <= 20
s 只包含从 a-z 的小写字母。
p 只包含从 a-z 的小写字母,以及字符 . 和 *。
保证每次出现字符 * 时,前面都匹配到有效的字符
算法分析

解题思路
dp
image
image

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

复杂性分析

时间复杂度:O(mn)
空间复杂度:O(mn)

http://www.lryc.cn/news/273963.html

相关文章:

  • lenovo联想拯救者8.8英寸掌上游戏机Legion Go 8APU1(83E1)原装出厂Windows11预装系统
  • 经典目标检测YOLO系列(一)复现YOLOV1(4)VOC2007数据集的读取及预处理
  • Android Studio xml布局代码补全功能失效问题
  • 算法每日一题:队列中可以看到的人数 | 单调栈
  • 报表控件Stimulsoft 2023回顾:都做了哪些产品的改变?
  • Mybatis缓存实现方式
  • C#用StringBuilder高效处理字符串
  • python开发案例教程-清华大学出版社(张基温)答案(4.2)
  • 【MATLAB】【数字信号处理】线性卷积和抽样定理
  • 什么是 MVVM ?
  • Redis(一)
  • 自动驾驶预测-决策-规划-控制学习(1):自动驾驶框架、硬件、软件概述
  • SSM建材商城网站----计算机毕业设计
  • js逆向第9例:猿人学第2题-js混淆-动态cookie1
  • [论文分享]TimesURL:通用时间序列表示学习的自监督对比学习
  • 解决sublime中文符号乱码问题
  • 厚积薄发11年,鸿蒙究竟有多可怕
  • pyDAL一个python的ORM(4) pyDAL查询操作
  • 如何通过Python将各种数据写入到Excel工作表
  • 跟着cherno手搓游戏引擎【2】:日志系统spdlog和premake的使用
  • Ubuntu20.04 上启用 VCAN 用作本地调试
  • LeetCode(31) 下一个排列
  • Git LFS: 简单高效的大文件版本控制
  • 如何培养用户思维
  • 由浅入深理解C#中的事件
  • Nginx(十六) 配置文件详解 - server stream服务流
  • Css中默认与继承
  • gitee上的vue大屏项目
  • 【LeetCode:114. 二叉树展开为链表 | 二叉树 + 递归】
  • 社保养老金发放计算方法