首先将匹配字符分成4个部分
[.] , [.*],[字母+*],[字母]
bool dp[1000][1000];
class Solution {
public:
bool isMatch(string s, string p) {
memset(dp,0,sizeof(dp));
int n=s.size(),m=p.size();
vector<string> vec;
int i,j;
for(i=0;i<m;i++)
{
string str="";
str+=p[i];
if(p[i]!='*')
vec.push_back(str);
else
vec.back()+=str;
}
dp[0][0]=1;
m=vec.size();
for(i=1;i<=m;i++)
{
string str=vec[i-1];
if(str.size()==2)
dp[i][0]=dp[i-1][0];
for(j=1;j<=n;j++)
{
if(str==".")
{
if(dp[i-1][j-1])
dp[i][j]=true;
}
else if(str.size()==2)
{
if(str[0]=='.')
{
if(dp[i-1][j-1]||dp[i-1][j]||dp[i][j-1])
dp[i][j]=true;
}
else
{
if(dp[i-1][j])
dp[i][j]=true;
else if(str[0]==s[j-1])
{
if(dp[i-1][j-1]||dp[i][j-1])
dp[i][j]=1;
}
}
}
else
{
if(dp[i-1][j-1]&&str[0]==s[j-1])
dp[i][j]=true;
}
}
}
return dp[m][n];
}
};
还可以用递归
class Solution {
public:
bool isMatch(string s, string p) {
if(p[0]=='\0')
return p[0]==s[0];
if(p[1]!='*')
{
if(s[0]==p[0]||(p[0]=='.'&&s[0]!='\0'))
return isMatch(s.substr(1),p.substr(1));
else
return false;
}
else
{
while(s[0]&&(s[0]==p[0]||p[0]=='.'))
{
if(isMatch(s,p.substr(2)))
return true;
s=s.substr(1);
}
return isMatch(s,p.substr(2));
}
return false;
}
};