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的大矩形,总共有多少种方法? 解题思路: ①方法一 对于这种题没有思路怎么办?可以先从最 ...
随机推荐
- urllib模块使用笔记
文中所有python代码均使用的是python2.7实现,与python3并不兼容. UrlLib模块 urllib模块是适用于一个简单的网络数据获取和处理(不能处理有关验证和cookie等功能),官 ...
- 12c新特性 在线操作数据文件
我们都知道,oracle pre-12c之前,若是想要把一个数据文件改名或者迁移, 必须在归档模式下先把这个数据文件offline之后, 然后进行OS上的copy或者rename 操作, 最后在sql ...
- 《HTTPS权威指南》读书笔记——PKI
互联网公钥基础设施 基于可信的第三方机构(CA,certification authority)实现不同成员在不见面的情况下进行安全通信 订阅人 需要证书来提供安全服务的团体 登记机构(RA) 完成证 ...
- December 07th, Week 49th Saturday, 2019
Snowflakes are pretty patterns etched in water's dreams. 雪花,是水在梦中镌刻的美丽图案. From Anthony T.Hincks. Tod ...
- Node.js上传文件出现Unexpected field
上传文件时,input框的name值要与node接口中single(' ')中的参数一致,否则会报"意外字段的错" 前端用的layui 后端node接口
- Node.js实现图片上传功能
node接口实现 const express = require('express') const mysql = require('mysql') const cors = require('cor ...
- 菜鸟刷面试题(一、Java基础篇)
目录: JDK 和 JRE 有什么区别? == 和 equals 的区别是什么? 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗? final 在 java 中有什 ...
- JavaScript-----13.内置对象 Math()和Date()
1. 内置对象 js对象分为3种:自定义对象(var obj={}).内置对象.浏览器对象. 前两种对象是js基础内容,属于ECMAScript,第三个浏览器对象是js独有的.讲js API的时候会讲 ...
- IT兄弟连 HTML5教程 CSS3揭秘 CSS3属性3
5 用户界面属性 在CSS3中,新的用户界面特性包括重设元素尺寸.盒尺寸及轮廓等.本小节着重介绍一下resize属性,只有Firefox 4和Safari 3浏览器支持此属性.resize属性可用于重 ...
- mySql中Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre的问题
报错信息 Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'a.id' ...