剑指offer——面试题53:正则表达式匹配

这个属于不是那么好做的题目之一。。。参考网址:https://www.nowcoder.com/profile/3639006/codeBookDetail?submissionId=19276572
leetcode中有个类似的题目,那个代码更严谨一些~LeetCode 10. Regular Expression Matching

Solution1:

代码中的注释写的不是太清楚,加一点:
一、当模式中的第二个字符不是“*”时:
1、如果字符串第一个字符和模式中的第一个字符相匹配,那么字符串和模式都后移一个字符,然后匹配剩余的。
2、如果字符串第一个字符和模式中的第一个字符相不匹配,直接返回false。
二、当模式中的第二个字符是“*”时:
如果字符串第一个字符跟模式第一个字符不匹配,则模式后移2个字符,继续匹配。如果字符串第一个字符跟模式第一个字符匹配,可以有3种匹配方式:
1、x*匹配0个字符。模式后移2字符,相当于x*被忽略;(一开始忘了即使当前字符匹配,也存在忽略掉的情况!!!)
2、x*匹配1个字符。字符串后移1字符,模式后移2字符;
3、x*匹配多于1个字符。字符串后移1字符,模式不变,即继续匹配字符下一位,因为*可以匹配多位;
注意:情况2可以被情况1和情况3包含。执行一次情况3,再执行一次情况1,就相当于情况2。

/*解这题需要把题意仔细研究清楚,反正我试了好多次才明白的。首先,考虑特殊情况:1>两个字符串都为空,返回true2>当第一个字符串不空,而第二个字符串空了,返回false(因为这样,就无法匹配成功了,而如果第一个字符串空了,第二个字符串非空,还是可能匹配成功的,比如第二个字符串是“a*a*a*a*”,由于‘*’之前的元素可以出现0次,所以有可能匹配成功)之后就开始匹配第一个字符,这里有两种可能:匹配成功或匹配失败。但考虑到pattern下一个字符可能是‘*’, 这里我们分两种情况讨论:pattern下一个字符为‘*’或不为‘*’:(下面的1>和2>结合上面的思路看!)1>pattern下一个字符不为‘*’:这种情况比较简单,直接匹配当前字符。如果匹配成功,继续匹配下一个;如果匹配失败,直接返回false。注意这里的“匹配成功”,除了两个字符相同的情况外,还有一种情况,就是pattern的当前字符为‘.’,同时str的当前字符不为‘\0’。2>pattern下一个字符为‘*’时,稍微复杂一些,因为‘*’可以代表0个或多个。这里把这些情况都考虑到:a>当‘*’匹配0个字符时,str当前字符不变,pattern当前字符后移两位,跳过这个‘*’符号;b>当‘*’匹配1个或多个时,str当前字符移向下一个,pattern当前字符不变。(这里匹配1个或多个可以看成一种情况,因为:当匹配一个时,由于str移到了下一个字符,而pattern字符不变,就回到了上边的情况a;当匹配多于一个字符时,相当于从str的下一个字符继续开始匹配)之后再写代码就很简单了。
*/
class Solution {
public:bool match(char* str, char* pattern){if (*str == '\0' && *pattern == '\0')return true;if (*str != '\0' && *pattern == '\0')return false;//if the next character in pattern is not '*'if (*(pattern+1) != '*'){if (*str == *pattern || (*str != '\0' && *pattern == '.'))return match(str+1, pattern+1);elsereturn false;}//if the next character is '*'else{if (*str == *pattern || (*str != '\0' && *pattern == '.'))return match(str, pattern+2) || match(str+1, pattern);//刚开始一直不懂为何要返回match(str, pattern+2)的值,原因在于'*'可以匹配0个字符//即使是当前字符匹配,也存在匹配0个字符的情况elsereturn match(str, pattern+2);}}
};

【重点】剑指offer——面试题53:正则表达式匹配相关推荐

  1. 剑指offer | 面试题53 - II. 0~n-1中缺失的数字

    转载本文章请标明作者和出处 本文出自<Darwin的程序空间> 本文题目和部分解题思路来源自<剑指offer>第二版 开始行动,你已经成功一半了,献给正在奋斗的我们 题目 一个 ...

  2. 剑指Offer - 面试题53 - I. 在排序数组中查找数字 I(二分查找的变形版本)

    1. 题目 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2示例 2: 输入: nums = [5,7,7,8, ...

  3. 剑指Offer - 面试题53 - II. 0~n-1中缺失的数字(二分、位运算)

    文章目录 1. 题目 2. 解题 2.1 充分利用题目信息 2.2 位运算 2.3 二分查找 1. 题目 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0-n-1之内.在范 ...

  4. 剑指offer面试题53 - II. 0~n-1中缺失的数字(二分查找)

    题目描述 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0-n-1之内.在范围0-n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字. 思路 详见链接 代码 ...

  5. 剑指offer面试题53 - I. 在排序数组中查找数字 I(二分查找)

    题目描述 统计一个数字在排序数组中出现的次数. 思路 详见链接 代码 class Solution:def search(self,nums:[int],target:int)->int:i, ...

  6. 剑指offe面试题19——正则表达式匹配

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

  7. 【重点】剑指offer——面试题65:滑动窗口的最大值

    剑指offer--面试题65:滑动窗口的最大值 Solution1: 笨蛋方法啊.. class Solution { public:vector<int> maxInWindows(co ...

  8. 【重点】剑指offer——面试题62:序列化二叉树

    剑指offer--面试题62:序列化二叉树 Solution1: 参考网址:https://www.nowcoder.com/profile/6475323/codeBookDetail?submis ...

  9. 【难题+重点】剑指offer——面试题40:数组中只出现一次的数字

    剑指offer--面试题40:数组中只出现一次的数字 Solution1: 书中展示了很棒的思路: 关于异或的两个性质应该知道: (1) X^X = 0; (2) X^0 = X; class Sol ...

最新文章

  1. 算法系列15天速成——第十天 栈
  2. 如何防止GSM手机被窃听
  3. WINDOWS 逻辑坐标 设备坐标 屏幕坐标 客户区坐标
  4. some screenshot for SAP Fiori smart template resource load
  5. SSM:Maven整合ssm时的步骤
  6. oracle biee 11g客户端连接OCI 10g/11g数据源时报错
  7. 平衡二叉树建立、实现和判断
  8. Atitit 提升扩展性 自由化理念 参数 第一章 前瞻性设计 第二章  自由化理念 自由化参数 json map等半结构化参数,dsl等全功能参数 自由化功能接口 dsl 自由化返回
  9. 记录一次失败的Git操作
  10. 用于重尾PLDA的快变分贝叶斯应用于i-vector和x-vector
  11. SOLIDWORKS PDM 2021安装步骤
  12. 计算机毕业设计Python+uniapp鲸落图书商城小程序LW(小程序+源码+LW)
  13. 相机对焦、标定等近期学习
  14. Matlab RGB 颜色对照表(0-1之间取值)
  15. mysql 通过load data local infile导入txt文件数据
  16. html天气插件iframe,HTML_利用iframe在网页中显示天气附效果截图,css: 复制代码代码如下: *{margi - phpStudy...
  17. 魔兽世界9.0主播最多的服务器,魔兽世界9.0新人服务器选什么好?
  18. 安装YLMF OS 5.0
  19. STC单片机操作系统——RTX51 Tiny
  20. PDF免费合并工具哪个好?在线处理,无需下载安装

热门文章

  1. lua和torch的安装
  2. 炼丹手册——梯度弥散和爆炸
  3. LabView学习笔记(十):条件结构
  4. 让apache支持mysql_Apache+PHP+Mysql环境搭建之三:配置Apache支持PHP
  5. 安卓9去掉搜索栏_android9.0隐藏虚拟按键跟状态栏,除去google搜索栏.
  6. ak和sk怎么认证 海康威视_“海康威视”也遭遇美断供了?董事长陈宗年回应:正在消化这一信息...
  7. python静态递归函数_Python递归函数
  8. 2021年四川省副高考试成绩查询,2021年四川省教育考试院成绩查询登录入口
  9. 正则分割 oracle,Oracle通过正则表达式分割字符串 REGEXP_SUBSTR
  10. sql 联合_SQL联合,SQL联合全部