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

【LeetCode】Day126-正则表达式匹配

题目

10. 正则表达式匹配【困难】

题解

用字符串匹配纠结了半天,结果解法是用动态规划,果然还是我太天真了

对于 p 中一个字符而言,它只能在 s 中匹配一个字符,匹配的方法具有唯一性;而对于 p 中字符 + 星号的组合而言,它可以在 s 中匹配任意自然数个字符,并不具有唯一性。因此我们可以考虑使用动态规划,对匹配的方案进行枚举。

官解说的云里雾里,个人感觉这篇题解「手画图解」动态规划,需要仔细的分情况讨论说的特别好,有图,分析也比较细致

  1. 状态定义:dp[i][j] 表示s[0…i-1]与p[0…j-1]是否能够匹配。

  2. 状态转移方程:本题最复杂的地方,关键是对于星号的讨论,p[j-1]星号可以让p[j-2]在s串中消失、重复一次、重复>=2次
    在这里插入图片描述

  3. 初始条件:dp[0][0]=true,表示两个空字符串可以匹配上

  4. 返回值:dp[m][n]

class Solution {
    public boolean isMatch(String s, String p) {
        int m=s.length(),n=p.length();
        boolean[][] dp=new boolean[m+1][n+1];
        dp[0][0]=true;
        for(int i=0;i<=m;i++){
            for(int j=1;j<=n;j++){
                if(p.charAt(j-1)=='*'){
                    dp[i][j]=dp[i][j-2];//无论p[j-2]是啥,都能被*消掉,因此dp[i][j]和dp[i][j-2]值相等
                    //若s[i-1]和p[j-2]匹配上,说明s[i-1]重复了多次
                    if(match(s,p,i,j-1)){
                        dp[i][j]=dp[i-1][j] || dp[i][j-2];
                    }
                }
                else{
                    //两个字母匹配上了或者和"."匹配上了
                    if(match(s,p,i,j)){
                        dp[i][j]=dp[i-1][j-1];
                    }
                }
            }
        }
        return dp[m][n];
    }
    public boolean match(String s,String p,int i,int j){
        if(i==0)
            return false;
        if(p.charAt(j-1)=='.')
            return true;
        return s.charAt(i-1)==p.charAt(j-1);
    }
}

时间复杂度: O ( m n ) O(mn) O(mn)

空间复杂度: O ( m n ) O(mn) O(mn)

相关文章:

  • 09-排序2 Insert or Merge(浙大数据结构)
  • DPDK18.08上对VIRTIO IN ORDER 功能所做的优化
  • java毕业设计软件S2SH人力资源管理系统|人事薪资招聘oa人力请假考勤工资[包运行成功]
  • 关于C/C++中const关键字作用的一些想法
  • STC15单片机-通过PWM调整灯亮度
  • 9.3DDD之集成事件
  • 抖音获取商品原数据API接口展示
  • C++ 删除链表的倒数第N个结点
  • Pinia的使用
  • java — 认识String类的常用方法(上)
  • 高速专线不打烊 DPDK Hotplug助你实现设备动态管理
  • 【数据结构 二叉树 递归与非递归遍历】
  • 微信公众号消息推送教程
  • MiddleWare ❀ Zookeeper基础概述
  • 多任务学习算法在推荐系统中的应用
  • hexo+github搭建个人博客
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 《剑指offer》分解让复杂问题更简单
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Android组件 - 收藏集 - 掘金
  • CentOS6 编译安装 redis-3.2.3
  • CSS实用技巧干货
  • golang中接口赋值与方法集
  • IDEA 插件开发入门教程
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • oschina
  • React Transition Group -- Transition 组件
  • Theano - 导数
  • Vue小说阅读器(仿追书神器)
  • 编写高质量JavaScript代码之并发
  • 从零搭建Koa2 Server
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 全栈开发——Linux
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 正则表达式
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​ubuntu下安装kvm虚拟机
  • (2)STL算法之元素计数
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (八十八)VFL语言初步 - 实现布局
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (数据结构)顺序表的定义
  • (一)基于IDEA的JAVA基础10
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)Mysql的优化设置
  • .Net Core和.Net Standard直观理解