剑指 Offer 19. 正则表达式匹配 + 动态规划
剑指 Offer 19. 正则表达式匹配
题目链接
一. 字符串匹配大致可以分为三种情况:
- 第一种:正则串的最后一个字符为正常字符,此时根据主串的最后一个字符是否和它相同来判断是否匹配,
如果相同,则看A[N-2]和B[M-2]是否匹配。 - 第二种:正则串的最后一个字符为【.】表示可以匹配任意一个字符,此时直接看A[N-2]和B[M-2]是否匹配。
- 第三种:正则串的最后一个字符为【*】表示匹配0或任意个数的B[M-2]。这又可以分为两种情况:
- 如果主串的最后一个字符不是B[M-2],则说明此时匹配的是0个B[M-2],只需要看A[N-1]和B[M-3](跳过了正则串的后两个字符)
- 如果主串的最后一个字符是B[M-2], 此时主串往前移动一个字符,表示匹配成功,但是正则串不动(可能*没有全部匹配成功)。
二. 转移方程:f[i][j]表示A主串的前i个字符是否可以和B正则串的前j个字符相匹配。
- 第一种情况和第二种情况可以合并在一起:
f[i][j] = f[i-1][j-1] - 第三种情况的转义方程如下所示:
- 如果主串的最后一个字符不是B[M-2],直接不看正则串的后两个字符:f[i][j] = f[i][j-2]
- 否则,正则串不动,主串往前移动一个字符:f[i][j] = f[i-1][j]
三. 初始值的设定:
- 主串和正则串都为空串,两者匹配:f[0][0] = true;
- 主串不为空,正则串为空,则必不匹配: f[i][0] = false;
- 主串为空,正则串不为空,此时需要进行判断,无法赋予初始值。
package com.walegarrett.offer;
/**
* @Author WaleGarrett
* @Date 2020/12/10 20:14
* 题目链接:https://leetcode-cn.com/problems/zheng-ze-biao-da-shi-pi-pei-lcof/
*/
/**
* 一. 字符串匹配大致可以分为三种情况:
* 第一种:正则串的最后一个字符为正常字符,此时根据主串的最后一个字符是否和它相同来判断是否匹配,
* 如果相同,则看A[N-2]和B[M-2]是否匹配。
* 第二种:正则串的最后一个字符为【.】表示可以匹配任意一个字符,此时直接看A[N-2]和B[M-2]是否匹配。
* 第三种:正则串的最后一个字符为【*】表示匹配0或任意个数的B[M-2]。这又可以分为两种情况:
* 1. 如果主串的最后一个字符不是B[M-2],则说明此时匹配的是0个B[M-2],只需要看A[N-1]和B[M-3](跳过了正则串的后两个字符)
* 2. 如果主串的最后一个字符是B[M-2], 此时主串往前移动一个字符,表示匹配成功,但是正则串不动(可能*没有全部匹配成功)。
*
* 二. 转移方程:f[i][j]表示A主串的前i个字符是否可以和B正则串的前j个字符相匹配。
* 1. 第一种情况和第二种情况可以合并在一起:
* f[i][j] = f[i-1][j-1]
* 2. 第三种情况的转义方程如下所示:
* 2.1 如果主串的最后一个字符不是B[M-2],直接不看正则串的后两个字符:f[i][j] = f[i][j-2]
* 2.2 否则,正则串不动,主串往前移动一个字符:f[i][j] = f[i-1][j]
*
* 三. 初始值的设定:
* 1. 主串和正则串都为空串,两者匹配:f[0][0] = true;
* 2. 主串不为空,正则串为空,则必不匹配: f[i][0] = false;
* 3. 主串为空,正则串不为空,此时需要进行判断,无法赋予初始值。
*/
public class Offer_19 {
public boolean isMatch(String s, String p) {
int lens = s.length();
int lenp = p.length();
boolean[][] dp = new boolean[lens+1][lenp+1];
for(int i = 0; i <= lens; i++){
for(int j = 0; j <= lenp; j++){
//正则串为空
if(j == 0){
//主串是否为空
dp[i][j] = (i == 0);
continue;
}
// 正则串此时位置是否为【*】字符
if(p.charAt(j-1) != '*'){
if(i > 0 && (s.charAt(i-1) == p.charAt(j-1) || p.charAt(j-1) == '.')){
dp[i][j] = dp[i-1][j-1];
}
}else{//正则串最后字符不包含*,则按照前两种情况处理
if(j > 1) {
dp[i][j] |= dp[i][j - 2];
}
if(i > 0 && j > 1 && (s.charAt(i-1) == p.charAt(j-2) || p.charAt(j-2) == '.')){
dp[i][j] |= dp[i-1][j];
}
}
}
}
return dp[lens][lenp];
}
}
剑指 Offer 19. 正则表达式匹配 + 动态规划的更多相关文章
- 【Java】 剑指offer(19) 正则表达式匹配
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请实现一个函数用来匹配包含'.'和'*'的正则表达式.模式中的字符 ...
- 剑指 Offer 19. 正则表达式匹配
题目描述 请实现一个函数用来匹配包含'. '和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次).在本题中,匹配是指字符串的所有字符匹配整个模式. ...
- 剑指offer:正则表达式匹配
目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:正则表达式匹配 题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符.表示任意一个字符,而*表示它前面的字符可以 ...
- Go语言实现:【剑指offer】正则表达式匹配
该题目来源于牛客网<剑指offer>专题. 请实现一个函数用来匹配包括 . 和 * 的正则表达式.模式中的字符.表示任意一个字符,而 * 表示它前面的字符可以出现任意次(包含0次). 在本 ...
- 剑指offer——21正则表达式匹配
题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式 ...
- 剑指Offer 52. 正则表达式匹配 (字符串)
题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式 ...
- [剑指Offer] 52.正则表达式匹配
题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式 ...
- 剑指 Offer 14- I. 剪绳子 + 动态规划 + 数论
剑指 Offer 14- I. 剪绳子 题目链接 还是343. 整数拆分的官方题解写的更清楚 本题说的将绳子剪成m段,m是大于1的任意一个正整数,也就是必须剪这个绳子,至于剪成几段,每一段多长,才能使 ...
- 剑指offer计划9(动态规划中等版)---java
1.1.题目1 剑指 Offer 42. 连续子数组的最大和 1.2.解法 得到转移方程后,单次遍历. 当前面的连续子数组的和比较是否大于0,是则加起来, 若小于零,则当前的值就可当子数组的开头. 判 ...
随机推荐
- UVA11400 Lighting System Design(DP)
You are given the task to design a lighting system for a huge conference hall. After doing a lot of ...
- P1439 【模板】最长公共子序列(DP)
题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出格式: 一个数,即最长公共子 ...
- ArcGIS处理栅格数据(一)
一.建立影像金字塔 ArcToolbox--数据管理工具--栅格--栅格属性--构建金字塔(pyramid) 说明:该方式一次只能为一张影像数据建立影像金字塔. ArcToolbox--数据管理工具- ...
- Redis 持久化(Persistence)
作为内存数据库,Redis 依然提供了持久化机制,其主要目的有两个: 安全:保证进程崩溃后数据不会丢失 备份:方便数据迁移与快速恢复 Redis 同时提供两种持久化机制: RDB 快照:数据库在某个时 ...
- codeforces 5E(非原创)
E. Bindian Signalizing time limit per test 4 seconds memory limit per test 256 megabytes input stand ...
- HDU 4335 What is N?(指数循环节)题解
题意: 询问有多少数\(n\)满足\(n^{n!}\equiv b\mod p \land\ n\in[1,M]\),数据范围:\(M\leq2^{64}-1,p\leq1e5\) 思路: 这题显然要 ...
- Linux 驱动框架---驱动中的阻塞
描述和API 阻塞IO和非阻塞IO的应用编程时的处理机制是不同的,如果是非阻塞IO在访问资源未就绪时就直接返回-EAGAIN,反之阻塞IO则会使当前用户进程睡眠直到资源可用.从应用场景来说两种方式分别 ...
- USB2.0协议学习笔记---描述符
USB设备描述符 字段名 长 度(字节) 地址偏移 含 义 bLenth 1 0 描述符长度 bDescriptorType 1 1 描述符类型 (这里为 1) ...
- MDN 文档高级操作进阶教程
MDN 文档高级操作进阶教程 MDN 文档, 如何优雅的使用 MDN 文档上的富文本编辑器 pre & 语法高亮器 code & note box source code 上传附件 i ...
- how to create react custom hooks with arguments
how to create react custom hooks with arguments React Hooks & Custom Hooks // reusable custom ho ...