正则表达式匹配 — C++实现
发布日期:2021-10-02 06:27:38
浏览次数:2
分类:技术文章
本文共 1208 字,大约阅读时间需要 4 分钟。
题目描述
请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配
解题思路
这是一个字符串匹配的问题,只是有一些特殊字符的干扰,出现.
可以代替任何字符,出现*
则可以消去一些字符,我们只需要关注*
,因为出现.
我们可以认为匹配上了。
首先我们应从模式字符串里进行匹配,并看下一位是否含有*
,如果有的话:
- 判断对应位置的字符是否相等,如果不相等,则模式字符串移动两位(消去),继续匹配
- 如果相等(出现
.
也算相等),则可以消去模式字符,也可以不消去,继续递归向后匹配
如果没有的话两个字符串位置对照进行比较,如果不相等则匹配不成功(模式字符串里有.
算做相等的情况)。
代码实现
class Solution { public: bool match(char* str, char* pattern) { if (str==NULL || pattern==NULL)return false; return handle(str,pattern); } bool handle(char *str,char *pattern){ if(*str=='\0' && *pattern=='\0')return true; if(*str!='\0' && *pattern=='\0')return false; if(*(pattern+1)=='*'){ if(*str==*pattern||(*pattern=='.' && *str!='\0')) return handle(str+1,pattern+2)||//b前面出现1次 handle(str+1,pattern)||//b前面出现n次 handle(str,pattern+2);//抹去前面,就算匹配了也不计数 else return handle(str,pattern+2);//不相等,但后一位出现了‘*’,可消去 } if(*str==*pattern||(*pattern=='.'&&*str!='\0')) return handle(str+1,pattern+1); return false; }};
运行时间:2ms占用内存:472k
转载地址:https://blog.csdn.net/Jeaten/article/details/108303947 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2024年04月07日 04时50分11秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
史上最简单的spring-boot集成websocket的实现方式
2021-06-30
带你玩转属于自己的spring-boot-starter系列(一)
2021-06-30
带你玩转属于自己自己的spring-boot-starter系列(二)
2021-06-30
带你玩转属于自己的spring-boot-starter系列(三)
2021-06-30
基于SnowFlake算法如何让分库分表中不同的ID落在同一个库的算法的实现
2021-06-30
Linux文件管理参考
2019-04-27
FTP文件管理项目(本地云)项目日报(一)
2019-04-27
FTP文件管理项目(本地云)项目日报(二)
2019-04-27
FTP文件管理项目(本地云)项目日报(三)
2019-04-27
FTP文件管理项目(本地云)项目日报(四)
2019-04-27
【C++】勉强能看的线程池详解
2019-04-27
FTP文件管理项目(本地云)项目日报(五)
2019-04-27
FTP文件管理项目(本地云)项目日报(关于不定长包的测试)
2019-04-27
FTP文件管理项目(本地云)项目日报(六)
2019-04-27
FTP文件管理项目(本地云)项目日报(七)
2019-04-27
FTP文件管理项目(本地云)项目日报(八)
2019-04-27