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

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

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

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

  2. 牛客网剑指Offer——正则表达式匹配

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

  3. 剑指offer52 构建乘积数组

    这个题的错误和c++ primier中名字的作用域例子相似.只是这里将int换成了vecto<int>这种形式. class Solution { public: vector<in ...

  4. 【Java】 剑指offer(19) 正则表达式匹配

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请实现一个函数用来匹配包含'.'和'*'的正则表达式.模式中的字符 ...

  5. 剑指offer:正则表达式匹配

    目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:正则表达式匹配 题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符.表示任意一个字符,而*表示它前面的字符可以 ...

  6. Go语言实现:【剑指offer】正则表达式匹配

    该题目来源于牛客网<剑指offer>专题. 请实现一个函数用来匹配包括 . 和 * 的正则表达式.模式中的字符.表示任意一个字符,而 * 表示它前面的字符可以出现任意次(包含0次). 在本 ...

  7. 剑指 Offer 19. 正则表达式匹配 + 动态规划

    剑指 Offer 19. 正则表达式匹配 题目链接 一. 字符串匹配大致可以分为三种情况: 第一种:正则串的最后一个字符为正常字符,此时根据主串的最后一个字符是否和它相同来判断是否匹配, 如果相同,则 ...

  8. 正则表达式匹配 牛客网 剑指Offer

    正则表达式匹配 牛客网 剑指Offer 题目描述 请实现一个函数用来匹配包括'.'和''的正则表达式.模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(包含0次). 在本题中, ...

  9. 《剑指offer》第十九题(正则表达式匹配)

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

随机推荐

  1. 常见的HTTP方法有哪些?

    GET:请求指定的页面信息,返回实体主体: HEAD:类似于get请求,只不过返回的响应中没有具体的内容,用于捕获报头: POST:向指定资源提交数据进行处理请求(比如表单提交或者上传文件),.数据被 ...

  2. 怎么样修改小程序分享的title/onShareAppMessage

    onShareAppMessage: function (res) { if (res.from === 'button') { // 来自页面内转发按钮 console.log(res.target ...

  3. 三行代码CSS竖向居中

    .element{ position:relative; top:50%; transform:translateY(-50%); } 这里无需设置高度或者父元素的position属性.(IE9可用) ...

  4. 如何实现数组与List的相互转换

    List转数组:toArray(arraylist.size()方法 数组转List:Arrays的asList(a)方法 List<String> arrayList = new Arr ...

  5. Oracle虚拟机 与 windows配置

    目录 相关资料 安装虚拟机及相关配置 安装PLSQL Developer Navicat Premium登录数据库 踩坑之路 相关资料 oracle虚拟机配置 提取码:s3sg 安装虚拟机及相关配置 ...

  6. JavaScript DOM的一些扩展

    对DOM的扩展主要是:Selectors API和HTML5. Selectors API Selectors API是由W3C发起指定的一个标准,致力于让浏览器原生支持CSS查询.Selectors ...

  7. sql server management studio 连接时指定非默认端口 ,port

  8. linux几种传输方式与拷贝方式的性能分析

    本文记录linux系统中文件传输的多种方式,留作备忘.linux中文件传输的方式有ftp,scp,rsync,rz,sz等,但各个工具的功能又有所区别: FTP : FTP是文件服务器,可实现文件的上 ...

  9. body-parser 解析post数据

    安装 $ npm install body-parser API var bodyPaeser =require('body-parser') bodyParse.raw(option) 将请求体内容 ...

  10. Chrome 浏览器自动填表呈现淡黄色解决

      Chrome 浏览器,当记住用户名和密码后,下次填写表单时,被记住的部分会被填充为淡黄色,有些时候不好看. 解决方式如下: input:-webkit-autofill {      -webki ...