转自: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") → 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
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;
}