简单的正则表达式匹配 Regular Expression Matching
2013-10-13 22:41
316 查看
题目源自于Leetcode。
只需要支持两个匹配符*和.。
'.' Matches any single character.
'*' Matches zero or more of the preceding element.
本题的要求是能够全部匹配整个母字符串,而不是包含有。
思路:母字符串和模式串双指针移动。会遇到最大的难点在于模式串遇到 .* 之后,母字符串该如何向后移动的问题,因为.*太灵活了,只有先知道之后的匹配情况才能对.* 进行适合的匹配,因此存在一个回溯的问题。
把循环改成递归,是一种很常用的策略。
若当前问题可以判定结果,则返回判定结果;
若在当前问题无法确定、需要依赖于之后的问题的时候,使用返回递归来求解之后的问题。
代码:
代码注释:
比较关键的一处是第11行为什么要用while循环。
首先要知道while循环的是母字符串从当前位置开始~直到~遇到不匹配或结尾的所有字符。为什么要这样?因为正则匹配符*是任意次数的匹配,我自己并不知道到底应该匹配多少次,所以只能每一次可以的匹配都做一遍,即每个状态空间子树都尝试一下。这些状态空间子树,注定是失败居多,少数或唯一一个成功,只要有一个子树是匹配的,当前状态就是匹配的。
这个逻辑是挺难理解的,多看几次。递归思想+分治思想。
1、考虑递归结束条件,即最原子化的问题。
2、只关注当前问题,子问题交给递归来做。
只需要支持两个匹配符*和.。
'.' Matches any single character.
'*' Matches zero or more of the preceding element.
本题的要求是能够全部匹配整个母字符串,而不是包含有。
The matching should cover the entire input string (not partial).
思路:母字符串和模式串双指针移动。会遇到最大的难点在于模式串遇到 .* 之后,母字符串该如何向后移动的问题,因为.*太灵活了,只有先知道之后的匹配情况才能对.* 进行适合的匹配,因此存在一个回溯的问题。
把循环改成递归,是一种很常用的策略。
若当前问题可以判定结果,则返回判定结果;
若在当前问题无法确定、需要依赖于之后的问题的时候,使用返回递归来求解之后的问题。
代码:
class Solution { public: bool isMatch(const char *s, const char *p) { if (s == NULL || p == NULL) return false; if (*p == '\0') return *s == '\0'; if (*(p + 1) == '*') //当前出现任意匹配 { while ((*s != '\0' && *p == '.') || *s == *p) //出现.* { if (isMatch(s, p + 2)) return true; ++s; } return isMatch(s, p + 2); } else if ((*s != '\0' && *p == '.') || *s == *p) //当前是正常匹配or.匹配 { return isMatch(s + 1, p + 1); } else //当前是错误匹配 return false; } };
代码注释:
比较关键的一处是第11行为什么要用while循环。
首先要知道while循环的是母字符串从当前位置开始~直到~遇到不匹配或结尾的所有字符。为什么要这样?因为正则匹配符*是任意次数的匹配,我自己并不知道到底应该匹配多少次,所以只能每一次可以的匹配都做一遍,即每个状态空间子树都尝试一下。这些状态空间子树,注定是失败居多,少数或唯一一个成功,只要有一个子树是匹配的,当前状态就是匹配的。
这个逻辑是挺难理解的,多看几次。递归思想+分治思想。
1、考虑递归结束条件,即最原子化的问题。
2、只关注当前问题,子问题交给递归来做。
相关文章推荐
- 一个小程序搞懂静态成员数据和静态成员函数
- jetty启动源码分析
- 组合数学 容斥原理 专题
- JSF
- 怎样做项目总结?
- LayoutParams和LayoutInflater理解
- 安卓系统源码编译系列(二)——安卓系统源码编译教程
- Debian7安装glibc2.8
- 数据结构(之)KMP算法
- 同花顺校园招聘笔试题 2014 武汉站
- 明源笔试题目--将一个正整数分解质因数
- 擦蛋的omnet++
- 树的直径
- Html笔记(七)表单
- 小型网络的ACL流控实例
- 【资源列表】MFC界面库
- 黑马程序员-------------(六)集合框架
- ASP.NET MVC 防止 CSRF 的方法
- sctp rfc相关文档
- OJB(Apache)