剑指 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,是则加起来, 若小于零,则当前的值就可当子数组的开头. 判 ...
随机推荐
- 2019HDU多校 Round6
Solved:2 02 Nonsense Time (LIS) 题意:给定一个全排列 最开始为空的 每秒中一个位置上的数出现 求每秒的LIS 题解:题解说 考虑时光倒流 倒着消掉 因为数据随机 所以期 ...
- Codeforces Round #529 (Div. 3) C. Powers Of Two (二进制)
题意:给你一个数\(n\),问是否能有\(k\)个\(2\)次方的数构成,若满足,输出一种合法的情况. 题解:从高到低枚举二进制的每一位,求出\(n\)的二进制的\(1\)的位置放进优先队列中,因为\ ...
- 3.keepalived+脚本实现nginx高可用
标题 : 3.keepalived+脚本实现nginx高可用 目录 : Nginx 序号 : 3 else exit 0 fi else exit 0 fi - 需要保证脚本有执行权限,可以使用chm ...
- KEIL5 使用STM32 官方例程
1. 安装keil5,破解 网上很多安装包/教程,跳过 2.下载官方固件库 https://www.st.com/content/st_com/en.html 在这里找微处理器,STM32 stand ...
- virtualBox 设置增强功能粘贴和拖放
virtualBox 5.2.8 (在运行的虚拟里中) 设备 -> 安装增强功能 virtualBox 管理器中设置(要在虚拟机关机的情况下配置) 常规 -> 高级里设置双向粘贴和拖放
- 833A The Meaningless Game
A. The Meaningless Game time limit per test 1 second memory limit per test 256 megabytes input stand ...
- js 可选链 & 空值合并 In Action
js 可选链 & 空值合并 In Action const obj = { props: { name: 'eric', }, // prop, 不存在的属性 ️ }; console.log ...
- es6 curry function
es6 curry function // vuex getters export const getAdsFilterConfig = (state) => (spreader) => ...
- 如何使用 js 写一个正常人看不懂的无聊代码
如何使用 js 写一个正常人看不懂的无聊代码 代码质量, 代码可读性, 代码可维护性, clean code WAT js WTF https://www.destroyallsoftware.com ...
- 如何关闭 iPad Pro 自动开启 wifi 和蓝牙
如何关闭 iPad Pro 自动开启 wifi 和蓝牙 为了省电,明明关闭了,但是发现每天都会自动开启,什么鬼设计 https://support.apple.com/zh-cn/HT208086 h ...