剑指 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,是则加起来, 若小于零,则当前的值就可当子数组的开头. 判 ...
随机推荐
- Codeforces Global Round 8 D. AND, OR and square sum(位运算)
题目链接:https://codeforces.com/contest/1368/problem/D 题意 给出一个大小为 $n$ 的数组 $a$,每次可以选两个下标不同的元素,一个赋为二者相与的值, ...
- AtCoder Beginner Contest 181 E - Transformable Teacher (贪心,二分)
题意:有一长度为奇数\(n\)的数组\(a\),和长度为\(m\)的数组\(b\),现要求从\(b\)中选择一个数放到\(a\)中,并将\(a\)分成\((n+1)/2\)个数对,求最小的所有数对差的 ...
- Java中赋值常量的注意事项
写在前面: 从网上学习的赋值规则 摘录自网络,标明出处 byte,short,int,long 比如 int a = 234; 此处的常量234类型默认是int,如果要将大的整数赋值给变量的话 必须 ...
- Codeforces Round #521 (Div. 3) E. Thematic Contests (离散化,二分)
题意:有\(n\)个话题,每次都必须选取不同的话题,且话题数必须是上次的两倍,第一次的话题数可以任意,问最多能选取多少话题数. 题解:我们首先用桶来记录不同话题的数量,因为只要求话题的数量,与话题是多 ...
- mysql-画图
目录 阿里数据库产品rds 淘宝数据库架构 数据库下载 Mysql3种安装方法 mysql_install_db安装数据库命令脚本中有生成初始mysql数据 也可以把mysql_install_db集 ...
- kubeadm---高可用安装
1.修改主机名 如何使用hostnamectl set-hostname name来为每台主机设置不同的机器名 #hostnamectl set-hostname k8s-master01 或者使用以 ...
- Hexo准备---Node.js、Vue
Hexo准备---Node.js.Vue 安装node.js 1.下载node 配置node.js环境官网下载,一直next就好,非常方便. 下载官网: http://nodejs.cn/downlo ...
- 涂颜色的RPG问题
长度为n的方格,刷3种颜色的颜料,相邻的方格颜料颜色不能相同,且首尾方格颜色不能相同.每个方格必须涂色.计算一共有多少种涂色方式. 解题思路:(1)f(1)=3,f(2)=6,f(3)=6 (2)如果 ...
- IFIX 数据源 节点 标签 域名
一个动画,前景颜色 数据源如上图 点 ,,, 进入选择界面,如下 Fix32 应该是统一的前缀,自动添加上的 然后就是我们的节点名字,启动ifix的时候显示的那个节点名字 标签应该就是我们的 变量/ ...
- ES6 Arrow Function All In One
ES6 Arrow Function All In One this const log = console.log; const arrow_func = (args) => log(`arg ...