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
'.' 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
注意:这里的a*表示a可以重复0次或者多次,不是a和*分开的。
思路:
待匹配串为S,匹配串为P。
简化问题,假设P中没有'*',那么我们只需要一位一位的比较S和P。
回到原问题,对于S[i]和P[j]:
如果P[j+1]!='*',S[i] == P[j]=>匹配下一位(i+1, j+1),S[i]!=P[j]=>return false;
如果P[j+1]=='*',如果p下一个是'*',那么(i+1,j),(i+1,j+2)都不匹配,则return false.如果匹配,看s下一个是否匹配。P排除‘*’,从j开始再数ai个,如果都不能匹配,则return false.如果超过了P的长度,则return false.
#include <iostream>
using namespace std;
bool reqularMatch(string s,string p)
{
for(int i=0;i<s.length();i++)
{
for(int j=0;j<p.length();j++)
{
if(s[i] == p[j])
{
int m =i+1,n=j+1;
while(m<s.length()&&n<p.length())
{
if(p[n] != '*')
{
//如果下一个不是‘*’
if(p[n] == '.' || s[m] == p[n])
{
m++;
n++;
}
else
{
return false;
}
}
else
{
//如果p下一个是'*',那么(i+1,j),(i+1,j+2)都不匹配,则return false.
//如果匹配,看s下一个是否匹配。P排除‘*’,从j开始再数ai个,如果都不能匹配,则return false.如果超过了P的长度,则return false.
int ai = m-i+1;
int aj = 0;
int w = j;
while(s[m]!=p[w]&&aj<=ai)
{
if(p[w]=='*')
{
w++;
if(w==p.length()) return false;
continue;
}
aj++;
w++;
if(w==p.length()) return false;
}
if(ai == aj)
{
return false;
}
m++;
}
}
}
}
}
return true;
}
void main()
{
string s= "ab";
string p= "c*ab*";
bool flag = reqularMatch(s,p);
printf("%s",flag?"Match!\n":"Not match!\n");
}