AcWing 30. 正则表达式匹配 (剑指OFFER leetcode 10)
题目描述
请实现一个函数用来匹配包括’.’和’*’的正则表达式。
模式中的字符’.’表示任意一个字符,而’*’表示它前面的字符可以出现任意次(含0次)。
在本题中,匹配是指字符串的所有字符匹配整个模式。
例如,字符串”aaa”与模式”a.a”和”abaca”匹配,但是与”aa.a”和”ab*a”均不匹配。
样例
输入: s="aa"
p="a*" 输出:true
算法1
很经典的题目 也相当的难。
采用动态规划
dp[i][j] 表示 s[0~i)的字符串与p[0~j)的字符串是否匹配
那么有以下几个转换状态
1 p[j-1] 是字母 而且与 s[i-1] 相等,那么当前dp[i][j]是否匹配就依赖于dp[i-1][j-1]
2 p[j-1] 是. 那么肯定与s[i-1]相等, 当前dp[i][j]是否匹配 就依赖于 dp[i-1][j-1]
情况1 2 类似 可以在代码中一起判断
3 p[j-1] 是 那么根据 表示的前面字母的多次重复还是0次重复 分为两种情况
3.1 如果是0次重复 那么当前的p[j-1] == ‘*’ 和 p[j-2] 都可以忽略不计。 那么 dp[i][j] = dp[i]j-2
3.2 如果是多次重复 那么 p[j-2] 与s[i-1] 相等 或者p[j-2]==’.’ 那么dp[i][j] = dp[i-1][j]
class Solution {
public:
vector<vector<int>> dp;
bool isMatch(string s, string p) {
int sn = s.size() ; int pn = p.size() ;
dp = vector<vector<int>>(sn+, vector<int>(pn+, ));
dp[][] = ;
for (int i = ; i <= sn; i++) {
for (int j = ; j <= pn; j++) {
if (i > && p[j - ] == '.' ) {
dp[i][j] = dp[i - ][j - ];
}
else if (i > && p[j - ] != '*' && p[j-] == s[i-]) {
dp[i][j] = dp[i - ][j - ];
}
else if (p[j - ] == '*') {
//*
if (j > && dp[i][j - ] == )
dp[i][j] = ;
else if (i > && j > && (p[j - ] == '.' || p[j - ] == s[i - ]) && dp[i - ][j] == )
dp[i][j] = ;
}
}
}
return dp[sn ][pn ];
}
};
作者:defddr
链接:https://www.acwing.com/solution/acwing/content/3390/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
AcWing 30. 正则表达式匹配 (剑指OFFER leetcode 10)的更多相关文章
- 【剑指offer】10矩阵覆盖
原创博文,转载请注明出处! 0.简介 # 本文是牛客网<剑指offer>刷题笔记,笔记索引链接 1.题目 # 用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地 ...
- 剑指offer 面试10题
面试10题: 题目:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.n<=39 n=0时,f(n)=0 n=1时,f(n)=1 n>1时,f(n)=f(n-1 ...
- 191.Number of 1Bits---位运算---《剑指offer》10
题目链接:https://leetcode.com/problems/number-of-1-bits/description/ 题目大意:与338题类似,求解某个无符号32位整数的二进制表示的1的个 ...
- 剑指 offer set 10 栈的压入、弹出序列
总结 1. 通过按位对比来判断, 没有更优的方法了
- 剑指offer第10题
import java.util.Scanner; /* 前两种方法是看最低为是不是为1,不为1则向右移动. 第一种只能对正整数有效,对负数不行,因为负数用的是补码,最高外符号位为1,最后右移动,肯定 ...
- 剑指offer(10)矩形覆盖
题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 题目分析 当然也可以逆向思维 应为可以横着放或竖着放,多以f ...
- 【剑指Offer】10、矩形覆盖
题目描述: 我们可以用2 X 1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2 X 1的小矩形无重叠地覆盖一个2 X n的大矩形,总共有多少种方法? 解题思路: 我们可以以2 X ...
- 剑指offer【10】- 变态跳台阶
题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 关于本题,前提是n个台阶会有一次n阶的跳法.分析如下: f(1) = 1 f(2) ...
- 【剑指offer】10:矩形覆盖
题目描述: 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 解题思路: ①方法一 对于这种题没有思路怎么办?可以先从最 ...
随机推荐
- SpringCloud之Feign 负载均衡请求超时时间
版本声明: SpringCloud:Greenwich.SR4 SpringBoot:2.1.9.RELEASE Feign调用服务的默认时长是1秒钟,也就是如果超过1秒没连接上或者超过1秒没响应,那 ...
- useradd命令详解(转)
1.作用 useradd或adduser命令用来建立用户帐号和创建用户的起始目录,使用权限是超级用户. 2.格式 useradd [-d home] [-s shell] [-c comment] [ ...
- JDK1.8 中的HashMap
HashMap本质上Java中的一种数据结构,他是由数组+链表的形式组织而成的,当然了在jdk1.8后,当链表长度大于8的时候为了快速寻址,将链表修改成了红黑树. 既然本质上是一个数组,那我们 ...
- JVM学习分享-思考题
package zero.desk.stringconstantpool; import org.junit.Test; /** * @author Zero * @since 2019-09-17. ...
- 松软科技web教程:JavaScript Switch 语句
switch 语句用于基于不同条件执行不同动作. JavaScript Switch 语句 请使用 switch 语句来选择多个需被执行的代码块之一. 语法 switch(表达式) { case n: ...
- Android五大布局详解——LinearLayout(线性布局)
Android五大布局 本篇开始介绍Android的五大布局的知识,一个丰富的界面显示总是要有众多的控件来组成的,那么怎样才能让这些控件能够按你的想法进行摆放,从而自定义你所想要的用户界面呢?这就牵涉 ...
- 2019 DevOps 技术指南
原文链接:https://hackernoon.com/the-2018-devops-roadmap-31588d8670cb 原文作者:javinpaul 翻译君:CODING 戴维奥普斯 写在前 ...
- 常用的git和repo命令
首先下图是git的流程图 相关概念 svn与git命令的对比 git常用命令 git log // 查看当前库的git log信息 git status ./ // 查看当前库的状态 git diff ...
- MATLAB实例:求相关系数、绘制热图并找到强相关对
MATLAB实例:求相关系数.绘制热图并找到强相关对 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 用MATLAB编程,求给定数据不同维度之间的相关系 ...
- 工具推荐--刷LeetCode的神器
本文首发于微信公众号:[坂本先生],文章地址为: https://mp.weixin.qq.com/s/vHv5hO8nils_g2VSKwu1Cg如有转载请标明出处 今天给大家安利一款快速刷Leet ...