剑指offer52:正则表达式匹配
1 题目描述
2 思路和方法
正则表达式中有三种情况:
a.普通字符
b.字符’.’
c.普通字符或’.’ + 字符’*’
碰到情况a、b都直接对比可以匹配,
难点在于处理情况c
情况c可以分两种子情况处理:
c1.字符串的首字母与模式的首字母不匹配,模式直接右移两格(相当于’*’前面的字符出现了0次)
c2.字符串的首字母与模式的首字母匹配,则:
字符串右移一格,模式不移动(’*’前面的字符出现了不止一次)
或字符串右移一格,模式右移两格(’*’前面的字符出现了刚好一次)
或字符串不移动,模式右移两格(’*’前面的字符出现了0次)
当字符串和模式同时走到结尾+1的位置,则表示匹配
当字符串走到结尾+1的位置,模式还没走到结尾+1的位置,还要继续匹配(因为模式后面可能还有a*b*可以匹配0个字符串)
当字符串还没走到结尾+1的位置,模式走到结尾+1的位置,则表示不匹配
3 C++核心代码
- class Solution {
- public:
- bool match(char* str, char* pattern) {
- if(str == nullptr && pattern == nullptr)
- return true;
- return matchCore(str, pattern);
- }
- bool matchCore(char* str, char* pattern){
- if(*str == '\0' && *pattern == '\0') //
- return true;
- if(*str != '\0' && *pattern == '\0') //
- return false;
- if(*(pattern+) == '*'){
- // 当前字符匹配
- if( *pattern == *str || (*pattern == '.' && *str!='\0')){
- return matchCore(str+, pattern) //str字符串右移一格,(’*’前面的字符出现了不止一次)模式不移动
- || matchCore(str+, pattern+) //str或字符串右移一格,模式右移两格(’*’前面的字符出现了刚好一次),模式状态改变
- || matchCore(str, pattern+); //str或字符串不移动,模式右移两格(’*’前面的字符出现了0次)忽略*字符
- }
- else
- return matchCore(str, pattern+); // 当前字符不匹配 忽略 *
- }
- // 逐个字符匹配
- if(*str == *pattern || (*pattern == '.' && *str!='\0'))
- return match(str+,pattern+);
- return false;
- }
- };
参考资料
https://blog.csdn.net/zjwreal/article/details/89055244(代码)
https://blog.csdn.net/u013908099/article/details/85954619(思路)
https://blog.csdn.net/qq1263292336/article/details/75734596(思路)
剑指offer52:正则表达式匹配的更多相关文章
- 剑指OFFER——正则表达式匹配
请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式.例如,字 ...
- 牛客网剑指Offer——正则表达式匹配
1. 题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整 ...
- 剑指offer52 构建乘积数组
这个题的错误和c++ primier中名字的作用域例子相似.只是这里将int换成了vecto<int>这种形式. class Solution { public: vector<in ...
- 【Java】 剑指offer(19) 正则表达式匹配
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请实现一个函数用来匹配包含'.'和'*'的正则表达式.模式中的字符 ...
- 剑指offer:正则表达式匹配
目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:正则表达式匹配 题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符.表示任意一个字符,而*表示它前面的字符可以 ...
- Go语言实现:【剑指offer】正则表达式匹配
该题目来源于牛客网<剑指offer>专题. 请实现一个函数用来匹配包括 . 和 * 的正则表达式.模式中的字符.表示任意一个字符,而 * 表示它前面的字符可以出现任意次(包含0次). 在本 ...
- 剑指 Offer 19. 正则表达式匹配 + 动态规划
剑指 Offer 19. 正则表达式匹配 题目链接 一. 字符串匹配大致可以分为三种情况: 第一种:正则串的最后一个字符为正常字符,此时根据主串的最后一个字符是否和它相同来判断是否匹配, 如果相同,则 ...
- 正则表达式匹配 牛客网 剑指Offer
正则表达式匹配 牛客网 剑指Offer 题目描述 请实现一个函数用来匹配包括'.'和''的正则表达式.模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(包含0次). 在本题中, ...
- 《剑指offer》第十九题(正则表达式匹配)
// 面试题19:正则表达式匹配 // 题目:请实现一个函数用来匹配包含'.'和'*'的正则表达式.模式中的字符'.' // 表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次).在本题 ...
随机推荐
- 读取文件名.cpp
#include <io.h> #include <iostream> #include <string> #include <windows.h> # ...
- Vue进阶(Bus/作用域slot/动态组件)
一.Vue非父子组件传值(Bus/总线/发布订阅模式/观察者模式) 我们在之前已经知道了父子传值.父组件传递过来了的值,在子组件通过props接受,然后就可以使用了. 也学过了隔代传值,均是通过pro ...
- Spring源代码分析:PropertiesLoaderSupport
概述 Spring PropertiesLoaderSupport是一个抽象基类,它抽象了从不同渠道加载属性的通用逻辑,以及这些属性应用优先级上的一些考虑.它所提供的这些功能主要供实现子类使用.Spr ...
- regasm注册com组件
注意: regasm.exe在不同framework版本下的系统路径 一般存储的路径为:C:\Windows\Microsoft.NET\Framework\v2.0.50727\ 系统的版本不同,运 ...
- ArcGIS后台地理处理(64 位)
注: 后台地理处理(64 位) 可用作 ArcGIS 10.1 for Desktop.Service Pack 1 及更高版本上的独立安装.只有在已安装 后台地理处理(64 位) 产品的情况下,以下 ...
- Linux系统中rm删除命令
rm命令 1.可以删除一个目录中的一个或多个文件或目录 2.可以将某个目录及其下属的所有文件及其子目录均删除掉 3.对于链接文件,只是删除整个链接文件,而原有文件保持不变 语法 rm (选项)(参数) ...
- OpenJudge计算概论-矩阵交换行
/*======================================================================== 矩阵交换行 总时间限制: 1000ms 内存限制: ...
- 构建Hadoop监控共同体
HDFS监控背后那些事儿,构建Hadoop监控共同体 原创: 应用研发部 京东云 2018-12-19 https://mp.weixin.qq.com/s/kulwDgwu-rYf4SvQ1dOwc ...
- python脚本实现-excel二级统计
pandas和SQL数据分析实战视频教程 https://study.163.com/course/courseMain.htm?courseId=1006383008&share=2& ...
- Android 定义和使用样式
如图,在stryle.xml中定义样式 然后可以在布局文件中使用样式