public:
bool isMatch(string s, string p) {
int sLength=s.length(),pLength = p.length(),i=0,j=0;//i,s的逆序号,j,p的逆序号
bool dp[sLength+1][pLength+1];//s尾部和p尾部字符串的匹配数组,0-slength,0-plength
for (int i = 0; i <= sLength; i++)
{
for (int j = 0; j <= pLength; j++)
{
dp[i][j] = false;
}
}
dp[0][0] = true;//s="",p=""
for(int i=1;i<=sLength;i++){
if(!( s[sLength-i] <= 'z' && s[sLength-i] >= 'a')){
return false;
}else{
dp[i][0] = false;
}
}
for(int i=1;i<=pLength;i++){
if(!(( p[pLength-i] <= 'z' && p[pLength-i] >= 'a') || p[pLength-i]=='.' || p[pLength-i]=='*')){
return false;
}
}
if(p.length()>=1){
dp[0][1] = false;
}
if(p.length()>=2){
dp[0][2] = (((p[pLength-2] >='a' && p[pLength-2]<='z')|| p[pLength-2]=='.') && p[pLength-1]=='*');
}
if(p.length()>=3){
j=3;
while (j<=pLength)
{
dp[0][j] = ((j%2 == 0) &&
((p[pLength-j] >='a' && p[pLength-j]<='z')|| p[pLength-j]=='.') &&
p[pLength-j+1]=='*' && dp[0][j-2]);
j++;
}
}
for(int i=1;i<=sLength;i++){
for (int j = 1; j <=pLength; j++)
{
//1.p[j] == s[i]
if(s[sLength-i]==p[pLength-j]||p[pLength-j]=='.'){
// a[s1s2...] a[p1p2...] 其中[s1s2...][p1p2...]能匹配
dp[i][j] = dp[i-1][j-1];
if(!dp[i][j] && j>=2){
//a[s1s2...] a[p1p2...] 其中[s1s2...][p1p2...]不能匹配
// 1.p ~ a*
if(p[pLength-j+1]=='*'){
int tempi = i;
dp[i][j] = (dp[i][j] || dp[tempi][j-2]);
while (tempi>=1)
{
if(s[sLength-tempi]==p[pLength-j]|| p[pLength-j]=='.'){
dp[i][j] = (dp[i][j] || dp[tempi-1][j-2]);
tempi--;
}else{
break;
}
}
}
//a. aa ab 不存在匹配情况,所以不需要进行 或
}
}else{
//2.p[j] != s[i],向后看
// if(p[pLength-j]=='*'){
// dp[i][j] = false;
// }
if(p[pLength-j]>='a' && p[pLength-j]<='z'){
if(j>=2 && p[pLength-j+1]=='*'){
//a[s1s2...] b[p1p2...] 其中[s1s2...][p1p2...]不能匹配
// p ~ b*
dp[i][j] = dp[i][j-2];
}
}
}
}
}
return dp[sLength][pLength];
}