Regular Expression Matching
来源:互联网 发布:关于网络信息收集 编辑:程序博客网 时间:2024/05/21 09:11
转自:http://blog.csdn.net/doc_sgl/article/details/12719761
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") → falseisMatch("aa","aa") → trueisMatch("aaa","aa") → falseisMatch("aa", "a*") → trueisMatch("aa", ".*") → trueisMatch("ab", ".*") → trueisMatch("aab", "c*a*b") → true
It seems that some readers are confused about why the regex pattern ".*"
matches the string"ab"
. ".*"
means repeat the preceding element 0 or more times. Here, the "preceding" element is the dot character in the pattern, which can match any characters. Therefore, the regex pattern".*"
allows the dot to be repeated any number of times, which matches any string (even an empty string). Think carefully how you would do matching of '*'
.Please note that '*'
in regular expression is different from wildcard matching, as we match the previous character 0 or more times. But, how many times? If you are stuck,recursion is your friend.
#include <iostream>#include<cmath>#include<cstring>using namespace std;class Solution {public: bool isMatch(const char *s, const char *p) { //end flag if(*p == '\0') return *s == '\0'; if(*(p+1) != '*') { if(*s != '\0' && (*s == *p || *p == '.') ) return isMatch(s+1,p+1); else return false; } else { //对于*重复次数的迭代处理 while(*s != '\0' && (*s == *p || *p == '.')) { if(isMatch(s,p+2)) return true; s++; } return isMatch(s,p+2); } }};int main(){ const char a[10] = "aaaabb"; const char b[10] = "a*bb"; Solution so; cout << so.isMatch(a,b) << endl; return 0;}
之前一直没理解,发现对if和return那两句有理解偏差。
if并没有改变p的指针,可以理解为assert。对于return,实际值指针已经改变。
#include <iostream>#include<cmath>#include<cstring>using namespace std;class Solution {public: bool isMatchTest(const char *s) { if(*s == '\0') return true; if(*(s+1) != '\0') cout<<*s<<endl; return isMatchTest(s+2); }};int main(){ const char a[10] = "abcdef"; Solution so; so.isMatchTest(a); //输出ace return 0;}
另外加了一段正常通配符可用的程序。 ?->一个字符 *->任意字符
#include <iostream>#include<cmath>#include<cstring>using namespace std;class Solution {public: bool isMatch(const char *s, const char *p) { //end flag if(*p == '\0') return *s == '\0'; if(*p != '*') { if(*s != '\0' && (*s == *p || *p == '?') ) return isMatch(s+1,p+1); else return false; } else { //对于*重复次数的迭代处理 /* if there is *, then there are two possibilities a) We consider current character of second string b) We ignore current character of second string.*/ return isMatch(s,p+1)||isMatch(s+1,p); } }};int main(){ const char a[10] = "txt.xls"; const char b[10] = "t?t.*"; Solution so; cout << so.isMatch(a,b) << endl; return 0;}
- LeetCode: Regular Expression Matching
- LeetCode: Regular Expression Matching
- leetcode Regular Expression Matching
- [Leetcode] Regular Expression Matching
- Regular Expression Matching
- Regular Expression Matching
- [LeetCode]Regular Expression Matching
- Regular Expression Matching
- LeetCode-Regular Expression Matching
- Regular Expression Matching
- Regular Expression Matching LeetCode
- Regular Expression Matching
- LeetCode | Regular Expression Matching
- LeetCode: Regular Expression Matching
- Leetcode: Regular Expression Matching
- [LeetCode] Regular Expression matching
- [LeetCode] Regular Expression Matching
- LeetCode Regular Expression Matching
- struts1.2 + spring2.5 + hibernate3.2框架搭建四之前台页面
- 分享一百多套开发视频教程的下载地址
- 值传递,指针传递,引用传递
- OCP-1Z0-051 第149题 子查询中ALL的应用
- 圆的比较
- Regular Expression Matching
- VMware View(二)——安装VMware Composer
- 【黑马程序员】01-OC的特点
- 多媒体类 java
- LeetCode: Count and Say [037]
- ProtoBuffer
- 《C++ Primer第四版》学习笔记(四)变量和基本类型 - 字面值常量
- [leetcode] python Remove Duplicates from Sorted Array II
- 表空间传输