题目:

请实现一个函数用来匹配包含‘.’和‘*’的正则表达式。模式中的字符'.'表示任意一个字符,而‘*’表示它前面的字符可以出现任意多次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串“aaa”与模式“a.a”和“ab*ac*a”匹配,但与“aa.a”和“ab*a”均不匹配。

思路:

其实主要分为两种情况,第一种是模式中的第二个字符串不是‘*’时,如果字符串中的第一个字符和模式中的第一个字符相匹配,那么在字符串和模式上都后移一个字符,然后匹配剩余的字符串和模式。第二种就是模式中的第二个字符串是‘*’时,会出现几种匹配的方式。一种选择是在模式上向后移动两个字符,另一种选择是保持模式不变。这两个情况要好好去理解一下,前面相当于是‘*’和它前面的字符被忽略了。

代码:

bool match(char* str, char* pattern)
{if (str == nullptr || pattern == nullptr)return false;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 + 1) == '*'){if (*pattern == *str || (*pattern == '.'&&*str != '\0'))return matchCore(str + 1, pattern + 2) || matchCore(str + 1, pattern) || matchCore(str, pattern + 2);else{return matchCore(str, pattern + 2);}}if (*str == *pattern || (*pattern) == '.'&&*str != '\0'){return matchCore(str+1, pattern+1);}}

复习:

这道题开始还是比较难想的,要理顺其中的关系才行。其中如果模式的第二个字符是“*”,有一种情况是可以重复“*”前面的那个字符若干次,那么字符串的第二个字符还是要和模式的第一个字符去匹配,这一点要注意。

二刷代码:

bool match(char* str, char* pattern)
{if (str == nullptr || pattern == nullptr)return false;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 + 1) == '*'){if (*str == *pattern || (*pattern == '.'&&*str != '\0')){return matchCore(str + 1, pattern + 2)|| matchCore(str, pattern + 2)|| matchCore(str + 1, pattern);}else {return matchCore(str, pattern + 2);}}if (*str == *pattern || (*pattern == '.'&&*str != '\0')){return matchCore(str + 1, pattern + 1);}return false;
}

剑指offe面试题19——正则表达式匹配相关推荐

  1. python正则表达式面试_【剑指offer】面试题19. 正则表达式匹配

    面试题19. 正则表达式匹配 请实现一个函数用来匹配包含'. '和''的正则表达式.模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(含0次).在本题中,匹配是指字符串的所有字 ...

  2. 【递归】剑指offer——面试题19:二叉树的镜像

    剑指offer--面试题19:二叉树的镜像 Solution1: 递归解法,牢记! 根结点为空的情况容易漏,注意! /* struct TreeNode {int val;struct TreeNod ...

  3. 剑指offer:面试题19. 正则表达式匹配

    题目:正则表达式匹配 请实现一个函数用来匹配包含'. '和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次).在本题中,匹配是指字符串的所有字符匹 ...

  4. [剑指offer]面试题19:二叉树的镜像

    面试题19:二叉树的镜像 题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像. 二叉树结点的定义如下: struct BinaryTreeNode {int value;BinaryTreeNo ...

  5. leetcode刷题之 剑指offe 面试题05. 替换空格 犯傻记录

    2020.3.6 刷到剑指offer第5题,题目描述如下: 题目本身没啥好说的,就是先统计空格的个数,然后把长度增加,用两个指针从后往前插. 采用m = s.count(' ',0,len(s)-1) ...

  6. 剑指offer面试题[19]-二叉树的镜像

    题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8/ \6 10/ \ / \5 7 9 11镜像二叉树8/ \10 6/ \ / \11 9 7 5 ...

  7. 剑指offe 面试题5, 从尾到头打印链表

    输入一个链表的头结点,从尾到头反过来打印每个结点的值. C++版本 struct ListNode {int m_nKey;ListNode* m_pNext; }; 方法1 使用栈的先进后出,将每个 ...

  8. 剑指offe面试题8 旋转数组的最小数字 (java实现)

    解题思路: 针对旋转数组的特点,即旋转后,数组的前半部分是有序的,后半部分是有序的. 1.先考虑一般情况:可以参考二分查找的思想,在数组中设置两个指针,一个指向数组的起始位置,一个指向数组的结束位置. ...

  9. 剑指Offe面试题:用两个栈实现队列

    用两个栈实现队列 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 分析 首先可以自己尝试使用1 2 3少量元素的入栈出栈摸索两个栈的使用,从特殊到一般 ...

最新文章

  1. Android JNI入门第四篇——jni头文件分析
  2. mysql 求数据的长度_mysql 如何求数据的长度
  3. SiteMesh:一个优于Apache Tiles的Web页面布局、装饰框架
  4. 任意两点间的最短路问题(Floyd-Warshall算法)
  5. bootstrap后台模板_免费bootstrap后台管理系统模板源码 网站后台模板_后台管理界面...
  6. C#GDI画圆及填充
  7. es6 数组合并_13个不low的JS数组操作,你需要知道一下
  8. LRU缓存 数据结构设计(C++)
  9. condition_variable_any
  10. 使用http连接到Analysis services
  11. 重磅!解读国内唯一入选全球顶会SIGCOMM的阿里云网络论文
  12. java认证考试例题_2016年Java认证考试题(3)
  13. 信息论与编码第三章课后题
  14. 【新书推荐】【2018.07】计算电磁学的MATLAB仿真(第四版)
  15. AppFabric 版本区分
  16. 在Mac上阻止相机和麦克风的方法
  17. 升降横移式立体车库设计(设计说明书+CAD图纸+开题报告+任务书+外文翻译+答辩相关材料)
  18. 数字IC设计工程师笔试面试经典100题
  19. paddle 40 支持任意维度数据的梯度平衡机制GHM Loss的实现(支持ignore_index、class_weight,支持反向传播训练,支持多分类)
  20. ARCHPR学习笔记

热门文章

  1. [英语阅读]希腊古剧场对高跟鞋说“不”
  2. excel流程图分叉 合并_快速制作组织架构图,层次结构图,流程图等,只需学会这个功能...
  3. 可穿戴设备,朝“超人”迈进
  4. Intel Technology Journal
  5. 中央电大 c语言程序设计a 试题,中央电大2008年秋C语言程序设计A试题5
  6. Debussy软件的脚本调用
  7. 广州布料批发市场_广州布料批发市场介绍_广州布料批发市场分析
  8. sentinel流量卫兵组件学习
  9. 用CH341A烧录外挂Flash (W25Q16JV)
  10. 好佳居软装十大品牌 软装可以提升格调