【一天一道LeetCode】#10. Regular Expression Matching
2016-04-19 00:09
330 查看
一天一道LeetCode系列
(一)题目
Implement regular expression matching with support for ‘.’ and ‘*’.‘.’ Matches any single character.
‘*’ Matches zero or more of the preceding element.
The matching should cover the entire input string (not partial).
The function prototype should be: bool isMatch(const char *s, const
char *p)
Some examples:
isMatch(“aa”,”a”) → false
isMatch(“aa”,”aa”) → true
isMatch(“aaa”,”aa”) → false
isMatch(“aa”, “a*”) → true
isMatch(“aa”,”.*”) → true
isMatch(“ab”, “.*”) → true
isMatch(“aab”, “c*a*b”) → true
(二)解题
本题的意思是实现正则表达式的判断函数。tips:评级为hard的题还真是难做!
考虑到aaaaaab和a*b,这种无法判断*的结束位置,需要用到动态规划来求解。
分为以下两种情况:
case 1:p[j+1] !=’*’时,无论是是s[i] == p[j]还是p[j]==’.’,状态转移方程均为dfs[i][j] = dfs[i+1][j+1];
case 2:p[j+1] == ‘‘时,这个时候就需要判断匹配的结束位置。
while(*s == *p || *s != '\0' && *p == '.') { if(Match(s,p+2)) return true; s++; }
结束位置找到以后状态转移方程为:dfs[i][j] = dfs[i][j+2];
接下来看代码:
class Solution { public: bool isMatch(string s, string p) { Match((const char *)&s[0],(const char *)&p[0]); } bool Match(const char *s,const char *p) { if(*p == '\0') return *s == '\0'; if(*(p+1) == '*') { while(*s == *p || *s != '\0' && *p == '.') { if(Match(s,p+2)) return true; s++; } return Match(s,p+2); } else { if(*s == *p ||*s != '\0' && *p == '.') { return Match(s+1,p+1); } return false; } } };
相关文章推荐
- load image
- jQuery Ajax 调用WebService实例详解
- jvm简介
- font简写语法
- 多线程编程中保证线程安全(1)
- LeetCode 刷题:Q1:Two Sum
- Marsaglia XORshift随机数算法
- LeetCode 79. Word Search
- Android架构知识
- 二叉搜索树的后序遍历序列
- Spring 获取propertise文件中的值
- ASP.NET中CheckBoxList复选框列表控件详细使用方法
- ASP.NET中DropDownList下拉框列表控件绑定数据的4种方法
- ASP.NET中FileUpload文件上传控件应用实例
- yii2中的rules 自定义验证规则详解
- ThinkPHP中where()使用方法详解
- ThinkPHP中limit()使用方法详解
- ThinkPHP中order()使用方法详解
- 又拍云异步上传实例教程详解
- Python实现文件复制删除