剑指offer52:正则表达式匹配

1 题目描述

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

2 思路和方法

  正则表达式中有三种情况:
  a.普通字符
  b.字符’.’
  c.普通字符或’.’ + 字符’*’

  碰到情况a、b都直接对比可以匹配,
  难点在于处理情况c
  情况c可以分两种子情况处理:
  c1.字符串的首字母与模式的首字母不匹配,模式直接右移两格(相当于’*’前面的字符出现了0次)
  c2.字符串的首字母与模式的首字母匹配,则:
    字符串右移一格,模式不移动(’*’前面的字符出现了不止一次)
    或字符串右移一格,模式右移两格(’*’前面的字符出现了刚好一次)
    或字符串不移动,模式右移两格(’*’前面的字符出现了0次)

  当字符串和模式同时走到结尾+1的位置,则表示匹配
  当字符串走到结尾+1的位置,模式还没走到结尾+1的位置,还要继续匹配(因为模式后面可能还有a*b*可以匹配0个字符串)
  当字符串还没走到结尾+1的位置,模式走到结尾+1的位置,则表示不匹配

3 C++核心代码

 1 class Solution {
 2 public:
 3     bool match(char* str, char* pattern) {
 4         if(str == nullptr && pattern == nullptr)
 5             return true;
 6         return matchCore(str, pattern);
 7     }
 8     bool matchCore(char* str, char* pattern){
 9         if(*str == ‘\0‘ && *pattern == ‘\0‘)    //
10             return true;
11         if(*str != ‘\0‘ && *pattern == ‘\0‘)    //
12             return false;
13         if(*(pattern+1) == ‘*‘){
14             // 当前字符匹配
15             if( *pattern == *str || (*pattern == ‘.‘ && *str!=‘\0‘)){
16                 return matchCore(str+1, pattern)      //str字符串右移一格,(’*’前面的字符出现了不止一次)模式不移动
17                     || matchCore(str+1, pattern+2)    //str或字符串右移一格,模式右移两格(’*’前面的字符出现了刚好一次),模式状态改变
18                     || matchCore(str, pattern+2);     //str或字符串不移动,模式右移两格(’*’前面的字符出现了0次)忽略*字符
19             }
20             else
21                 return matchCore(str, pattern+2);    // 当前字符不匹配 忽略 *
22         }
23         // 逐个字符匹配
24         if(*str == *pattern || (*pattern == ‘.‘ && *str!=‘\0‘))
25             return match(str+1,pattern+1);
26         return false;
27     }
28 };

参考资料

https://blog.csdn.net/zjwreal/article/details/89055244(代码)

https://blog.csdn.net/u013908099/article/details/85954619(思路)

https://blog.csdn.net/qq1263292336/article/details/75734596(思路)

原文地址:https://www.cnblogs.com/wxwhnu/p/11428958.html

时间: 2024-11-08 13:31:49

剑指offer52:正则表达式匹配的相关文章

剑指Offer52:正则表达式匹配(Java)

参考: 左程云进阶算法第8节视频内容(2小时18分钟处) 视频百度网盘:链接:https://pan.baidu.com/s/1beVfli8bmH9obwNW3NT3Kg 提取码:q5bi loveforever个人博客网站:https://zhenganwen.top/posts/310d4836/ (有左神算法基础,进阶视频完整笔记代码) 思路分析: 递归版本大概听懂了,动态规划的解法听不懂.看不懂这个题的网上解析的博客不妨看看左神的视频. 递归解法有两个关键点: 递归解法以函数f(i,j

剑指OFFER——正则表达式匹配

请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式.例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配 感觉有点难. 分析:递归实现 每次分别在str 和pattern中取一个字符进行匹配,如果匹配,则匹配下一个字符

正则表达式匹配-剑指Offer

正则表达式匹配 题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式.例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配 思路 当遇到'.'的时候,任何字符都匹配,好处理 当遇到'*'的时候,有三种可能: 出

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

1 #include"iostream" 2 using namespace std; 3 4 bool MatchCore(char*str,char* pattern); 5 6 bool Match(char* str,char* pattern) 7 { 8 if(str==nullptr||pattern==nullptr) 9 return false; 10 return MatchCore(str,pattern); 11 } 12 13 bool MatchCore(

53 - 正则表达式匹配

题目: 请实现一个函数用来匹配包含'.'和'*'的正则表达式. 模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次). 本题中,匹配是指字符串的所有字符匹配整个模式. 例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"及"ab*a"均不匹配. 解析: 字符串 str = "aaa"; 模式字符串 pattern = "

《剑指offer》全部题目-含Java实现

陆续刷了好久,算是刷完了<剑指offer>,以下全部AC代码,不一定性能最优,如有错误或更好解答,请留言区指出,大家共同交流,谢谢~ 1.二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. public class Solution { public boolean Find(int target, int [][] array) { if(array == n

【剑指Offer学习】【所有面试题汇总】

剑指Offer学习 剑指Offer这本书已经学习完了,从中也学习到了不少的东西,现在做一个总的目录,供自已和大家一起参考,学如逆水行舟,不进则退.只有不断地学习才能跟上时候,跟得上技术的潮流! 所有代码下载[https://github.com/Wang-Jun-Chao/coding-interviews] 目录 第01-10题 [剑指Offer学习][面试题02:实现Singleton 模式--七种实现方式] [剑指Offer学习][面试题03:二维数组中的查找] [剑指Offer学习][面

金三银四,磨砺锋芒;剑指大厂,扬帆起航(最全Android开发工程师面试指南)

引言 元旦匆匆而过,2020年的春节又接踵而来,大家除了忙的提着裤子加班.年底冲冲冲外,还有着对于明年的迷茫和期待! 2019年有多少苦涩心酸,2020年就有更多幸福美好,加油,奥利给!怀着一颗积极向上的心,来面对未来每一天的挑战! 所谓"兵马未动,粮草先行",我们打响明天的战役也需要精神食粮来做后勤保障才是. 在此我整理了一份安卓开发面试指南,希望对磨砺锋芒.奋发向上的小伙伴有所帮助,祝你早日剑指大厂,扬帆起航,奥利给! Java基础 Java集合框架 Java集合--ArrayLi

剑指offer (2) c++实现singleton模式

转自:http://www.jellythink.com/archives/82 问题描述 现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能:在实际开发过程中,会专门有一个日志模块,负责写日志,由于在系统的任何地方,我们都有可能要调用日志模块中的函数,进行写日志.那么,如何构造一个日志模块的实例呢?难道,每次new一个日志模块实例,写完日志,再delete,不要告诉我你是这么干的.在C++中,可以构造一个日志模块的全局变量,那么在任何地方就都可以用了,是的,不错.但是