【剑指offer】17. 正则表达式匹配(java)

news2024/11/24 12:29:32

文章目录

  • 正则表达式匹配
    • 描述
    • 示例1
    • 示例2
    • 示例3
    • 示例4
    • 思路
    • 完整代码

正则表达式匹配

描述

请实现一个函数用来匹配包括’.‘和’*'的正则表达式。

1.模式中的字符’.'表示任意一个字符

2.模式中的字符’*'表示它前面的字符可以出现任意次(包含0次)。

在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串 "aaa" 与模式"a.a"和 "ab*ac*a" 匹配,但是与 "aa.a""ab*a" 均不匹配

数据范围:

1.str 只包含从 a-z 的小写字母。

2.pattern 只包含从 a-z 的小写字母以及字符 .*,无连续的 '*'

  1. $0≤str.length≤26 $
  2. 0 ≤ p a t t e r n . l e n g t h ≤ 26 0≤pattern.length≤26 0pattern.length26

示例1

输入:

"aaa","a*a"

返回值:

true

说明:

中间的*可以出现任意次的a,所以可以出现1次a,能匹配上              

示例2

输入:

"aad","c*a*d"

返回值:

true

说明:

因为这里 c 为 0 个,a被重复一次, * 表示零个或多个a。因此可以匹配字符串 "aad"。              

示例3

输入:

"a",".*"

返回值:

true

说明:

".*" 表示可匹配零个或多个('*')任意字符('.')              

示例4

输入:

"aaab","a*a*a*c"

返回值:

false

思路

一个最最最简单的办法就是使用String提供的match方法,可以直接匹配正则表达式,并返回true或false,至少对于题目提供的案例都能通过

public boolean match (String str, String pattern) {
    // write code here
    return str.matches(pattern);
}

但这题考点主要是动态规划,参考官方答案

  • dp[i][j]表示str前i个字符和pattern前j个字符是否匹配。(需要注意这里的i,j是长度,比对应的字符串下标要多1)
  • (初始条件) 首先,毋庸置疑,两个空串是直接匹配,因此 d p [ 0 ] [ 0 ] = t r u e dp[0][0]=true dp[0][0]=true。然后我们假设str字符串为空,那么pattern要怎么才能匹配空串呢?答案是利用'*'字符出现0次的特性。遍历pattern字符串,如果遇到'*'意味着它前面的字符可以出现0次,要想匹配空串也只能出现0,那就相当于考虑再前一个字符是否能匹配,因此 d p [ 0 ] [ i ] = d p [ 0 ] [ i − 2 ] dp[0][i]=dp[0][i-2] dp[0][i]=dp[0][i2]
  • (状态转移) 然后分别遍历str与pattern的每个长度,开始寻找状态转移。首先考虑字符不为'*'的简单情况,只要遍历到的两个字符相等,或是pattern串中为’.'即可匹配,因此最后一位匹配,即查看二者各自前一位是否能完成匹配,即 d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] dp[i][j]=dp[i-1][j-1] dp[i][j]=dp[i1][j1]。然后考虑'*'出现的情况:
    1. pattern[j - 2] == '.' || pattern[j - 2] == str[i - 1]:即pattern前一位能够多匹配一位,可以用'*'让它多出现一次或是不出现,因此有转移方程 d p [ i ] [ j ] = d p [ i − 1 ] [ j ] ∣ ∣ d p [ i ] d p [ j − 2 ] dp[i][j]=dp[i-1][j]||dp[i]dp[j-2] dp[i][j]=dp[i1][j]∣∣dp[i]dp[j2]
    2. 不满足上述条件,只能不匹配,让前一个字符出现0次, d p [ i ] [ j ] = d p [ i ] [ j − 2 ] dp[i][j]=dp[i][j-2] dp[i][j]=dp[i][j2]

alt

完整代码

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param str string字符串
     * @param pattern string字符串
     * @return bool布尔型
     */
    public boolean match (String str, String pattern) {
        // write code here
        int n1 = str.length();
        int n2 = pattern.length();
        //dp[i][j]表示str前i个字符和pattern前j个字符是否匹配
        boolean[][] dp = new boolean[n1 + 1][n2 + 1];
        //遍历str每个长度
        for (int i = 0; i <= n1; i++) {
            //遍历pattern每个长度
            for (int j = 0; j <= n2; j++) {
                //空正则的情况
                if (j == 0) {
                    dp[i][j] = (i == 0 ? true : false);
                    //非空的情况下 星号、点号、字符
                } else {
                    if (pattern.charAt(j - 1) != '*') {
                        //当前字符不为*,用.去匹配或者字符直接相同
                        if (i > 0 && (str.charAt(i - 1) == pattern.charAt(j - 1) ||
                                      pattern.charAt(j - 1) == '.')) {
                            dp[i][j] = dp[i - 1][j - 1];
                        }
                    } else {
                        //碰到*
                        if (j >= 2) {
                            dp[i][j] |= dp[i][j - 2];
                        }
                        //若是前一位为.或者前一位可以与这个数字匹配
                        if (i >= 1 && j >= 2 && (str.charAt(i - 1) == pattern.charAt(j - 2) ||
                                                 pattern.charAt(j - 2) == '.')) {
                            dp[i][j] |= dp[i - 1][j];
                        }
                    }
                }
            }
        }
        return dp[n1][n2];
    }
}

这里需要按位进行操作,不清楚为什么

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/751031.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

scrapy---爬虫界的django

1介绍 scrapy架构 引擎(EGINE)&#xff1a;引擎负责控制系统所有组件之间的数据流&#xff0c;并在某些动作发生时触发事件。大总管&#xff0c;负责整个爬虫数据的流动 调度器(SCHEDULER)用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个U…

[QT编程系列-8]:C++图形用户界面编程,QT框架快速入门培训 - 3- QT窗体设计 - 自定义对话框

目录 3. QT窗体设计 3.6 自定义对话框 3.6.1 种类 3.6.2 输入对话框​编辑 3.6.3 字体对话框 3.6.4 文件对话框​编辑 3.6.5 颜色对话框 3.6.6 输出对话框​编辑 3.6.7 进度条对话框​编辑 3.6.8 自定义对话框​编辑 3. QT窗体设计 3.6 自定义对话框 在QT中&#xff…

软考A计划-系统集成项目管理工程师-项目人力资源管理-下

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

Pytorch学习笔记 | 深度学习框架简介 | 环境安装

文章目录 知名深度学习框架的开发公司,以及框架的演变过程最流行的两个框架:pytorch和tensorflow两个框架最核心的区别是什么?什么是动态图和静态图环境安装CUDA是什么如何查看自己电脑的显卡类型如何安装cuda如何确认安装好了呢?如何测试安装pytorch知名深度学习框架的开发…

左神算法之中级提升(5) 背包问题

目录 【案例1】 【题目描述】 【思路解析】 【代码实现】 【案例2】 【 2019 网易面试题】 【题目描述】 【思路解析】 【代码实现】 【案例3】 【题目描述】 【思路分析】 【代码实现】 【案例1】 【题目描述】 【思路解析】 背包问题&#xff1a; 【代码实现】 /**…

【分布式能源的选址与定容】基于多目标粒子群算法分布式电源选址定容规划研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

解决git clone的库文件太大的问题

一直想git clone 下来的我自己库可能库大小太大&#xff0c;git不下来 https://www.kancloud.cn/maryong/maryong/1800760 在网络情况不稳定下克隆项目时&#xff0c;可能会出现下图中的错误。 问题原因&#xff1a; http缓存不够或者网络不稳定等。 解决方案&#xff1a;打开…

运算符重载和const成员 (日期类的实现C++)

运算符重载和const成员 const成员const修饰类成员函数const对象调用权限小结 运算符重载 const成员 const成员函数&#xff1a;const修饰的成员函数。const修饰类成员函数&#xff0c;实际限制的是*this&#xff0c;表明该成员函数不能对类的任何成员进行修改。 const修饰类成…

设计模式-建造者模式在Java中使用示例

场景 建造者模式 复杂对象的组装与创建 没有人买车会只买一个轮胎或者方向盘&#xff0c;大家买的都是一辆包含轮胎、方向盘和发动机等多个部件的完整汽车。 如何将这些部件组装成一辆完整的汽车并返回给用户&#xff0c;这是建造者模式需要解决的问题。 建造者模式又称为…

复选框,购物车功能,单选,全选

<template><view class"index"><u-navbar title"购物车" :is-back"false" :border-bottom"false" title-color"#333":background"{background:#fff}"><view class"page_navbar_warp&qu…

探究ThreadLocal和ThreadPoolExecutor中的内存泄露风险与防范策略

探究ThreadLocal和ThreadPoolExecutor中的内存泄露风险与防范策略 本文将探讨ThreadLocal和ThreadPoolExecutor中可能存在的内存泄露问题&#xff0c;并提出相应的防范策略。 ThreadPoolExecutor的内存泄露问题 ThreadPoolExecutor是一个线程池类&#xff0c;它可以管理和复…

【PHP面试题39】linux下面chmod和chown使用详解

文章目录 一、前言二、什么是 chmod 命令&#xff1f;2.1 使用方法&#xff1a;2.2 数值表示法&#xff1a;2.3 符号表示法&#xff1a; 三、什么是 chown 命令&#xff1f;3.1 使用方法&#xff1a;3.2 更改所有者和用户组&#xff1a; 四、使用示例4.1 使用 chmod 命令修改权…

媒体邀约:企业新品发布会如何邀约记者到现场采访报道?

媒介易是国内领先的全媒体广告营销平台&#xff0c;专注全媒体营销平台创新服务。我们有超过近11年的实战经验&#xff0c;我们拥有丰富的媒体记者资源&#xff0c;关于邀约记者到现场采访&#xff0c;我们会采取以下步骤&#xff1a; 1、提前策划&#xff1a;在发布会前至少…

MATLAB 基于NDT的点云配准实验(不同参数效果) (25)

MATLAB 基于NDT的点云配准实验(不同参数效果) (25) 一、算法简介二、具体使用1.代码(注释详细)2.结果(不同参数 与ICP比较)一、算法简介 NDT点云配准与ICP一样,都是经典的点云配准算法,这里使用MATLAB进行ndt点云配准,对配准结果进行显示,并尝试不同参数,得到较好…

单元测试用例到底该如何设计?

目录 前言 使用参数方法创建测试用例 使用执行路径方法创建测试用例 总结 前言 最近一些大公司在进行去测试化的操作&#xff0c;这一切的根源大概可以从几年前微软一刀切砍掉所有内部正式的测试人员开始说起&#xff0c;当时微软内部的测试工程师有一部分转职成了开发工程…

STM32 Proteus仿真红外检测PWM调速温控风扇-0073

STM32 Proteus仿真红外检测PWM调速温控风扇-0073 Proteus仿真小实验&#xff1a; STM32 Proteus仿真红外检测PWM调速温控风扇-0073 功能&#xff1a; 硬件组成&#xff1a;STM32F103C6单片机 LCD1602显示器DS18B20温度传感器人检测 按下说明有人L298驱动电机模拟风扇 1.按键…

PWM呼吸灯设计

呼吸灯&#xff1a; 呼吸灯是一种特殊的灯光效果&#xff0c;它可以模拟呼吸的效果&#xff0c;即灯光逐渐由暗变亮再由亮变暗&#xff0c;循环往复。这种效果给人一种柔和、舒缓的感觉&#xff0c;常被应用在装饰、照明和显示等领域。 PWM呼吸灯设计&#xff1a; 在数字电路设…

Windows搭建Nginx实现RTMP转为HLS流

所需软件 nginx-1.7.11.3-Gryphon&#xff08;这个包含必须的RTMP模块&#xff0c;普通的Ngxin没有这个&#xff09;ffmpegVLC 配置Nginx 1为Nginx配置RTMP和HLS 这里定义了一个叫live的RTMP路径。同时设置其开启HLS功能&#xff0c;那么所有推送到这个地址的RTMP流都会自动生…

AWS MSK集群认证和加密传输的属性与配置

通常&#xff0c;身份认证和加密传输是两项不相关的安全配置&#xff0c;在Kafka/MSK上&#xff0c;身份认证和加密传输是有一些耦合关系的&#xff0c;重点是&#xff1a;对于MSK来说&#xff0c;当启用IAM, SASL/SCRAM以及TLS三种认证方式时&#xff0c;TLS加密传输是必须的&…

C++STL库中的string

文章目录 STL库对于string类的介绍 string常用接口 string类的模拟实现 string对象大小的计算 写时拷贝 前言 C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字…