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++核心代码

 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(思路)

最新文章

  1. shell脚本比较两个数大小
  2. GoLang语言
  3. CSS overflow 属性
  4. MySQL-Front 建表引发的一点小思考(数据表格模版)
  5. vector 去重复
  6. Laravel 5 中的配置
  7. C++11 move_iterator
  8. 修改tomcat的部署名称
  9. 转:C#整数三种强制类型转换int、Convert.ToInt32()、int.Parse()的区别
  10. Delphi的组件读写机制
  11. 新浪微博。。openapi 分享 图画+ 写作
  12. log4CXX第二篇---配置文件(properties文件)详解
  13. C11 constant expressions 常量表达式
  14. LEB128相关知识
  15. 将Json数据 填充到 实例类 的函数
  16. LINUX新建和增加SWAP分区
  17. CentOS 7 lnmp环境配置laravel项目的问题总结!
  18. Intellij Idea 教程
  19. Java类加载双亲委托模式优点
  20. 微信开发者工具_小程序js文件后面的M代表什么

热门文章

  1. Lua 常用函数 一
  2. P1197 [JSOI2008]星球大战——链式前向星+并查集
  3. [bzoj 4650][NOI 2016]优秀的拆分
  4. Python3 输入和输出(二)
  5. (转)hadoop 常规错误问题(一)
  6. 小程序can't read property 'push' of undefined
  7. GC类型以及不同类型GC的搭配
  8. php如何生成 uuid(总结)
  9. linux tcp 高并发最大连接数
  10. js求数组最大值方法