Description:
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
解题思路:
题意为实现正则表达式的匹配。其中支持.和*
分成三种情况。设当前字符串和模式的下标分别为i,j
1、若当前模式匹配完毕,即p[j]==’\0’,若字符串结束,则返回true,否则返回false
2、若模式的下一个字符不是,即p[j+1]!=’‘。这里分情况讨论。
(1) 若s[i]==p[j],递归验证i+1, j+1
(2) 若p[i]==’.’且s[i]!=’\0’,递归验证i+1, j+1
(3) 否则,返回false
3、若模式的下一个字符是,即p[j+1]==’‘,则不断通过递归回溯i+k,j+2(k从0增长至len(s)-i,j+2意味着越过当前字符和*)。
代码:
#include <iostream>
using namespace std;
bool isMatch(const char *s, const char *p)
{
if (*p == '\0')
return *s == '\0';
if (*(p+1) != '*')
{
if ((*s == *p) || (*p == '.' && *s != '/0'))
return isMatch(s+1, p+1);
else
return false;
}
else
{
while((*s == *p) || (*p == '.' && *s != '/0'))
{
if(isMatch(s, p+2))
return true;
s++;
}
return isMatch(s, p+2);
}
}
int main()
{
char *s1 = "abbbc", *p1 = "ab*c";
char *s2 = "ac", *p2 = "ab*c";
char *s3 = "abbc", *p3 = "ab*bbc";
char *s4 = "abc", *p4 = "abbc";
cout<<boolalpha<<isMatch(s1, p1)<<endl;
cout<<boolalpha<<isMatch(s2, p2)<<endl;
cout<<boolalpha<<isMatch(s3, p3)<<endl;
cout<<boolalpha<<isMatch(s4, p4)<<endl;
return 0;
}
测试:
参考链接: