当前位置:网站首页>10. 正则表达式匹配
10. 正则表达式匹配
2022-07-26 05:10:00 【小卢要刷力扣题】
前言
`
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。
‘.’ 匹配任意单个字符
‘*’ 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。
示例 1:
输入:s = “aa”, p = “a”
输出:false
解释:“a” 无法匹配 “aa” 整个字符串。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/regular-expression-matching
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
样本对应模型
定义二维表
字符串有效性检查
str不能有.和*
exp开头不能是*.两个*不能挨着
public static boolean isValid(char[] s, char[] e) {
// s中不能有'.' or '*'
for (int i = 0; i < s.length; i++) {
if (s[i] == '*' || s[i] == '.') {
return false;
}
}
// 开头的e[0]不能是'*',没有相邻的'*'
for (int i = 0; i < e.length; i++) {
if (e[i] == '*' && (i == 0 || e[i - 1] == '*')) {
return false;
}
}
return true;
}
暴力递归
递归含义:
str从si出发及其后面的所有,能不能被exp从ei出发及其后面的所有配出来
能配出来返回true,否则false
ei下一个位置不是*
如果ei+1不是 * ,就说明我e没有操作空间了。它不能指望后面的 * 把它变没,代表此时si必须能和ei对上
只能是[ei]字符等于[si]字符
要么[ei]字符是 . ,它能够变成一切ei+1是*
0)变零个
让a*变0个a,后面去匹配
1)变1个a
2)变2个a
3) 3个a
4) 4个a
每一种分支全都走,但有一个走通,直接返回true,所有分支都走不通,返回false,
public static boolean isMatch1(String str, String exp) {
if (str == null || exp == null) {
return false;
}
char[] s = str.toCharArray();
char[] e = exp.toCharArray();
return isValid(s, e) && process(s, e, 0, 0);
}
// str[si.....] 能不能被 exp[ei.....]配出来! true false
public static boolean process(char[] s, char[] e, int si, int ei) {
if (ei == e.length) {
// exp 没了 str?
return si == s.length;
}
// exp[ei]还有字符
// ei + 1位置的字符,不是*
if (ei + 1 == e.length || e[ei + 1] != '*') {
// ei + 1 不是*
// str[si] 必须和 exp[ei] 能配上!
return si != s.length && (e[ei] == s[si] || e[ei] == '.') && process(s, e, si + 1, ei + 1);
}
// exp[ei]还有字符
// ei + 1位置的字符,是*!
while (si != s.length && (e[ei] == s[si] || e[ei] == '.')) {
if (process(s, e, si, ei + 2)) {
return true;
}
si++;
}
return process(s, e, si, ei + 2);
}
斜率优化+记忆化搜索

f(13, 29)的依赖

f(12, 29)的依赖
f(12, 29)=f(13,29)+f(12,31)
在str中i位置字符和str中i+ 1位置字符它一样的时候就存在这个优化
当我一-个格子有枚举行为的时候,我就观察他已经算过的格子,能不能把枚举行为替代掉,
从而得到一一个使用有限若干个位置的方式来得到这一个格子的值
public static boolean isMatch2(String str, String exp) {
if (str == null || exp == null) {
return false;
}
char[] s = str.toCharArray();
char[] e = exp.toCharArray();
if (!isValid(s, e)) {
return false;
}
int[][] dp = new int[s.length + 1][e.length + 1];
// dp[i][j] = 0, 没算过!
// dp[i][j] = -1 算过,返回值是false
// dp[i][j] = 1 算过,返回值是true
return isValid(s, e) && process2(s, e, 0, 0, dp);
}
public static boolean process2(char[] s, char[] e, int si, int ei, int[][] dp) {
if (dp[si][ei] != 0) {
return dp[si][ei] == 1;
}
boolean ans = false;
if (ei == e.length) {
ans = si == s.length;
} else {
if (ei + 1 == e.length || e[ei + 1] != '*') {
ans = si != s.length && (e[ei] == s[si] || e[ei] == '.') && process2(s, e, si + 1, ei + 1, dp);
} else {
if (si == s.length) {
// ei ei+1 *
ans = process2(s, e, si, ei + 2, dp);
} else {
// si没结束
if (s[si] != e[ei] && e[ei] != '.') {
ans = process2(s, e, si, ei + 2, dp);
} else {
// s[si] 可以和 e[ei]配上
ans = process2(s, e, si, ei + 2, dp) || process2(s, e, si + 1, ei, dp);
}
}
}
}
dp[si][ei] = ans ? 1 : -1;
return ans;
}
边栏推荐
- Alibaba cloud industrial vision intelligent engineer ACP certification - Preparation
- Nacos registry
- Seata submits at details in two stages
- Shell的read 读取控制台输入、read的使用
- 测试必备工具之Fiddler,你真的了解吗?
- ALV程序收集
- C语言详解系列——函数的认识(4)函数的声明与定义,简单练习题
- MySQL basic learning
- Week 6 Learning Representation: Word Embedding (symbolic →numeric)
- 【洛谷】P1383 高级打字机
猜你喜欢

Earth system model (cesm) practical technology

真正的科学减肥

Excel VBA: summarize calculation output results by date (SUMIF)
![提升命令行效率的 Bash 快捷键 [完整版]](/img/ec/f0dd2fbfac6853ae60d7cf52d8f3e1.png)
提升命令行效率的 Bash 快捷键 [完整版]
![[weekly translation go] how to write your first program with go](/img/77/cf77a46340a39797382fd7b60517d5.png)
[weekly translation go] how to write your first program with go

MySQL eight knowledge points: from getting started to deleting the database

LeetCode链表问题——203.移除链表元素(一题一文学会链表)

DOM event flow event bubble event capture event delegate

Embedded sharing collection 20

C语言函数
随机推荐
ALV入门
mysql函数汇总之日期和时间函数
Alibaba three sides: how to solve the problems of MQ message loss, duplication and backlog?
【洛谷】P1383 高级打字机
Full analysis of domain name resolution process means better text understanding
CMD operation command
Your understanding of the "happen before principle" may be wrong?
Excel VBA: realize automatic drop-down filling formula to the last line
Excel VBA: summarize calculation output results by date (SUMIF)
Security permission management details
黑吃黑?男子破解赌博网站漏洞,每月“薅羊毛”10多万元
Excel vba: saving multiple worksheets as new files
Week 6 Learning Representation: Word Embedding (symbolic →numeric)
“双碳”目标下资源环境中的可计算一般均衡(CGE)模型实践技术
Learn to map with nature medicine -- complex heat map
Recommendation system - machine learning
嵌入式开发小记,实用小知识分享
测试用例评审如何开展
Redis solves the problem of oversold inventory
MySQL eight knowledge points: from getting started to deleting the database