leetcode题库10--正则表达式匹配
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。
‘.’ 匹配任意单个字符
‘*’ 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。
说明:
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。
思路:
因为有*号可以匹配多个字符,使用动态规划来保存所有匹配情况。
dp[i][j]表示s的前i个字符和p的前j个字符匹配。
有了状态,接下来就是考虑状态转移方程。
1.如果是字符或是’.’,就很简单。
dp[i][j] = dp[i-1][j-1] (s[i]==p[j] || p[j]=='.')
2.如果p[j]是’*’,由于 可以匹配多个字符。这里考虑:
(1)不匹配。 判断去掉*和前一个字符是否匹配dp[i][j] = dp[i][j-2])
(2) 先匹配s[i]字符,再检查i之前的字符是否匹配, 如果不匹配则dp[i][j]不匹配。()dp[i][j] = dp[i-1][j] (s[i]==p[j] || p[j]=='.')
bool isMatch(string s, string p) {//dp[i][j] 表示s的前i个字符和p的前j个字符匹配int n = s.size(), m = p.size();if(m == 0){ // 边界特判if(n == 0) return true;else return false;}if(p[0] == '*') return false; // 星号前面没有其他字符是非法的状态vector<vector<bool>> dp(n + 1, vector<bool>(m + 1, false));dp[0][0] = true;s = "#" + s; //加一个字符是为了索引都转为1开始p = "#" + p;for(int i = 2; i <= m; i ++){ // 处理0的情况。也就p和空字符串匹配的情况if(p[i] == '*') dp[0][i] = dp[0][i - 2];// else dp[0][i] = false;}for(int i = 1; i <= n; i ++){ // 开始进行状态转移for(int j = 1; j <= m; j ++){if(p[j] != '*'){// 不是星号,这样就只需判断s[i] 和 p[j] ,字符是否能匹配dp[i][j] = dp[i-1][j-1] && (s[i] == p[j] || p[j] == '.'); } else{ //*号,这里只有两种情况,一个就是匹配0个,还有匹配了s[i]。 //比如 aaab和aaab* b*匹配一个b, 然后判断aaa 和 aaab*是否匹配 dp[i][j] = dp[i][j - 2] || dp[i-1][j] && (s[i] == p[j - 1] || p[j - 1] == '.'); }}}return dp[n][m];}
leetcode题库10--正则表达式匹配相关推荐
- LeetCode题库10:正则表达式匹配——JavaScript解答
题目描述: 给定一个字符串 (s) 和一个字符模式 §.实现支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符. '*' 匹配零个或多个前面的元素. 匹配应该覆盖整个字符串 (s) ...
- LeetCode精讲题 10正则表达式匹配(动态规划)
标题 题目描述 递归(超时) 动态规划 结语 题目描述 先点赞再观看.帅哥靓女养成好习惯. 10 正则表达式匹配 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和'*'的正则表达 ...
- [动态规划] leetcode 10 正则表达式匹配
[动态规划] leetcode 10 正则表达式匹配 1.题目 题目链接 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符 ...
- Java实现 LeetCode 10 正则表达式匹配
10. 正则表达式匹配 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配, ...
- LeetCode算法复健:10.正则表达式匹配
10.正则表达式匹配 日期:2022/7/5 题目描述:给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符 '*' 匹配零个或 ...
- LeetCode题库解答
此篇博客用于记录自己在 LeetCode 网站中所做过的习题,便于日后忘记了进行查阅.前期全部采用 Python3的语法来解答,后续时间充裕的话,希望自己可以试着用 JavaScript.C++/C ...
- LeetCode题库第2题 两数相加
两数相加 LeetCode题库第二题 两数相加 看完题目,就可以将题目抽象为三个指针,前两个指针是l1和l2,后一个指针是我们要求的,这三个指针同时移动,由于可能会产生进位,所以可以用一个变量来存储这 ...
- LeetCode题库第1题 两数之和
两数之和 LeetCode题库第1题 两数之和 看到题,我就想到了暴力法: public int[] force(int[] nums,int target) {for (int i = 0; i & ...
- LeetCode题库整理【Java】—— 2 两数相加
LeetCode题库整理[Java] 2.两数相加 题目:给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果, ...
- LeetCode题库整理【Java】—— 7整数反转
LeetCode题库整理[Java] 7.整数反转 题目:给出一个32位的有符号整数,你需要将这个这个整数中每位上的数字进行反转. 示例1: 输入: 123 输出: 321 示例2: 输入: -123 ...
最新文章
- 给Ubuntu 16.04更换更新源
- Nis服务器主从安装配置
- 【IOI2018】狼人【Kruscal重构树】【主席树】
- LeetCode 1760. 袋子里最少数目的球(二分查找)
- php 给图片加水印
- Atitit java项目常用类库表 目录 1. Ati总的常用库	1 1.1. 表达式,语言解析类库	1 1.2. 字符串模板解析库velocity freemark	1 1.3. rest库
- 微信公众账号开发入门准备
- The General Framework Of Signal ProcessingOTFS Modulation Scheme(信号处理的一般框架OTFS调制)(4)
- linux查看内存条pn,查看电脑内存条型号的两种方法【图文】
- linux模拟tcp测试工具,TCP测试小工具tcping for linux
- Dev C++项目开发是添加背景音乐 CC++
- yuv图片旋转180度,镜像水平翻转
- Windows 7 旗舰版 64位 (纯净版)
- 利用Yocto构建嵌入式Linux教程02--Yocto的一些基本概念介绍
- Camera ISO、快门、光圈、曝光这几个概念
- 语音识别之HTK入门(二)
- 教你快速高效接入SDK——Unity统一接入渠道SDK(Android篇)
- 在JSP中使用数据库
- 复古风的小鱼缸,还有幻彩灯效加持,忆趣TV3.0体验
- 好用又简单的引流技巧:你只需要一篇软文
热门文章
- python中reshape_python numpy reshape用法及代码示例
- Pyspider爬虫实例:1号店医药电商
- pytorch学习笔记(十四):实战Kaggle比赛——房价预测
- python——pandas库之DataFrame数据结构基础
- ~~欧几里得算法(附模板题)
- 用openbabel将pdbqt文件转成pdb
- 配置一台用于深度学习的个人工作站系统的实验记录[主机可以买现成的或自己配,裸机即可]
- tensorflow代码中的一个bug
- 机器学习-极大似然估计
- 【Qt串口调试助手】1.2 - 串口数据接收不发生换行,CH340 / CP2102 多硬件兼容