剑指offer:正则表达式匹配
题目
题目链接
剑指offer:正则表达式匹配
题目描述
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符.表示任意一个字符,而*表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配。
解题思路
1.分析题目
- 输入:一个待匹配字符串,一个待匹配正则表达式
- 输出:字符串与正则表示式相匹配则输出
true,否则输出false - 条件:正则表达式中仅含两个特殊字符;
.表示任意一个字符,*表示它前面的字符能够出现0~无数次。题目未说明是否贪心匹配(即尽可能多的匹配)的情况下,应默认非贪心匹配。即应考虑类似aaa与a*aa相匹配的情况。同时注意可能会出现.*这类能够匹配所有字符的表达式。
2.可能出现的情况
考虑字符串和正则相匹配时能够相消去,则当最终两者为空时为匹配成功;中途有不匹配且不带*的字符或是最终不能相互消去时为匹配失败。这种情况很显然使用指针移动特别好用。
考虑情况如下:
- 字符串空时,正则式不为空。后者剩余字符若皆为带/*字符,则应继续消去。
- 当前指针指向字符能够消去时(正则式当前指针字符与字符串当前指针字符相同,或是正则式当前指针字符为
.且字符当前指针不为\0),需要考虑正则指针的下一步指向是否为*。为*则需要考虑此时是否非贪心匹配。 - 当前指针指向字符不可相互消去时,需考虑正则指针下一步指向是否为
*,为*则可忽略正则指针此时的不匹配字符,令其向前移两位;否则直接匹配失败。例如aaa与ab*c*aa能匹配成功。
3.思考解题步骤
在2中所考虑的情况都能够用起初的思路--指针移动解决,故确定以指针为解题方向。
同时,每一步对于当前指针指向字符的处理过程都是相似的,故考虑使用递归使代码更加简洁。
很惭愧,在编写2中指针字符相互消去的情况时,我发现自己写的代码总是会遗漏部分情况,查看错误样例后发现对*的非贪心匹配处理要写出大量逻辑繁琐且容易出错的代码。在查看讨论区的解答后,发现自己一直走了死胡同。对于这种问题应考虑使用动态规划的思想,将情况一分为二的处理,分别计算继续判断当前*与结束当前*匹配的情况。
具体代码
class Solution {
public:
bool match(char* str, char* pattern)
{
if (*str == '\0' && *pattern == '\0')
return true;
// 1.匹配带*正则(包括非贪心情况)
if (*str == *pattern || (*pattern == '.' && *str != '\0'))
{
// 不是正则式
if (*(pattern + 1) != '*')
return match(++str, ++pattern);
// 是正则式
// 将*字符的匹配一分为二的处理
return match(str, pattern + 2) || match(str + 1, pattern);
}
// 消去无用带*字符
else if (*(pattern + 1) == '*')
{
pattern += 2;
return match(str, pattern);
}
return false;
}
};
剑指offer:正则表达式匹配的更多相关文章
- 剑指OFFER——正则表达式匹配
请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式.例如,字 ...
- 牛客网剑指Offer——正则表达式匹配
1. 题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整 ...
- 【Java】 剑指offer(19) 正则表达式匹配
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请实现一个函数用来匹配包含'.'和'*'的正则表达式.模式中的字符 ...
- Go语言实现:【剑指offer】正则表达式匹配
该题目来源于牛客网<剑指offer>专题. 请实现一个函数用来匹配包括 . 和 * 的正则表达式.模式中的字符.表示任意一个字符,而 * 表示它前面的字符可以出现任意次(包含0次). 在本 ...
- 剑指 Offer 19. 正则表达式匹配 + 动态规划
剑指 Offer 19. 正则表达式匹配 题目链接 一. 字符串匹配大致可以分为三种情况: 第一种:正则串的最后一个字符为正常字符,此时根据主串的最后一个字符是否和它相同来判断是否匹配, 如果相同,则 ...
- 正则表达式匹配 牛客网 剑指Offer
正则表达式匹配 牛客网 剑指Offer 题目描述 请实现一个函数用来匹配包括'.'和''的正则表达式.模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(包含0次). 在本题中, ...
- 剑指 Offer 31. 栈的压入、弹出序列 + 入栈顺序和出栈顺序的匹配问题
剑指 Offer 31. 栈的压入.弹出序列 Offer_31 题目详情: 解析: 这里需要使用一个栈来模仿入栈操作. package com.walegarrett.offer; /** * @Au ...
- 剑指offer习题集2
1.把数组排成最小的数 class Solution { public: static bool compare(const string& s1, const string& s2) ...
- 面试经典算法题集锦——《剑指 offer》小结
从今年 3 月份开始准备找实习,到现在校招结束,申请的工作均为机器学习/数据挖掘算法相关职位,也拿到了几个 sp offer.经历这半年的洗礼,自己的综合能力和素质都得到了一个质的提升. 实话说对于未 ...
随机推荐
- IPv6静态路由、动态路由
实验涉及命令以及知识补充 IPv6 接口必须配置 IPv6 地址和子网掩码 使用 ipv6 address ipv6-address/prefix-length [link-local | eui-6 ...
- SQL Server中的三种Join方式
1.测试数据准备 参考:Sql Server中的表访问方式Table Scan, Index Scan, Index Seek 这篇博客中的实验数据准备.这两篇博客使用了相同的实验数据. 2.SQ ...
- A^B Mod C (51Nod - 1046 )(快速幂)
给出3个正整数A B C,求A^B Mod C. 例如,3 5 8,3^5 Mod 8 = 3. Input 3个正整数A B C,中间用空格分隔.(1 <= A,B,C <= 10^ ...
- python实践项目—Collatz序列
Collatz序列题意说明 编写一个名为collatz()的函数,它有一个名为number 的参数.如果参数是偶数,那么collatz()就打印出number // 2,并返回该值.如果number ...
- javascript--BOM的onload事件和onunload事件
1.onload事件 onload,页面加载后执行,所谓页面加载完成,指页面上所有的元素创建完毕,引用的所有的外部资源(js.css.图片)等下载完毕. 所以onload执行的比较晚,因为如果页面上有 ...
- 实现php Curl 调用不同项目中方法
之前为了实现跨项目调用方法,遇到的一些问题和解决方法总结. 话不多说,直接复制代码先跑了再说! jq代码. $.ajax({ type: "post", dataType: &qu ...
- docker化安装grafana
继续进行docker改造. 1. 找镜像.拉取镜像 [root@devlop ~]# docker search grafana INDEX NAME DESCRIPTION STARS OFFICI ...
- git克隆出错 github clone Permission denied (publickey) fatal Could not read from remote repo
原文网址:http://blog.csdn.net/feeling450/article/details/53067563 github clone "Permission denied ( ...
- 03---Nginx配置文件
#启动子进程程序默认用户#user nobody;#一个主进程和多个工作进程.工作进程是单进程的,且不需要特殊授权即可运行:这里定义的是工作进程数量worker_processes 1; #全局错误日 ...
- Android开发——View绘制过程源码解析(二)
0. 前言 View的绘制流程从ViewRoot的performTraversals开始,经过measure,layout,draw三个流程,之后就可以在屏幕上看到View了.上一篇已经介绍了Vi ...