LeetCode Regular Expression Matching

513人阅读 评论(0)

bool isMatch(const char *s, const char *p)
{
if(s==NULL||p==NULL) return false;
if(*s==0&&*p==0) return true;
else
{
if(*s==0&&*p!=0)
{
const char *q=p;
while(*q)
{
if(*(q+1)!='*') return false;
q+=2;
}
return true;
}
else
{
if(*s!=0&&*p==0)
{
const char *q=s;
while(*q)
{
if(*(q+1)!='*') return false;
q+=2;
}
return true;
}
else
{
if(*(s+1)!='*'&&*(p+1)!='*')
{
if(*s==*p)
return isMatch(s+1,p+1);
else
{
if(*s=='.'||*p=='.')
return isMatch(s+1,p+1);
else
return false;
}
}
else
{
if(*(s+1)=='*'&&*(p+1)!='*')
{
bool flag=false;
const char *q=p;
if (*s=='.')
{
while(*q)
{
//if((*q!=*s)&&(*s!='.')&&(*p!='.')) return false;
flag = isMatch(s+2,q);
q++;
if(*q=='*')q++;
if(flag==true) return true;
}
return isMatch(s+2,q);
}
else
{
while (*q&&*q==*s)
{
flag = isMatch(s+2,q);
q++;
if(*q=='*')q++;
if(flag==true) return true;
}
return isMatch(s+2,q);
}
}
else
{
if(*(s+1)=='*'&&*(p+1)=='*')
{
return isMatch(s+2,p)||isMatch(s,p+2)||isMatch(s+2,p+2);
}
else
{
bool flag=false;
const char *q=s;
if (*p=='.')
{
while(*q)
{
//if(*q!=*p&&*p!='.'&&*s!='.') return false;
flag = isMatch(q,p+2);
q++;
if(*q=='*')q++;
if(flag==true) return true;
}
return isMatch(q,p+2);
}
else
{
while (*q&&*q==*p)
{
flag = isMatch(q,p+2);
q++;
if(*q=='*')q++;
if(flag==true) return true;
}
return isMatch(q,p+2);
}

}
}
}
}
}
}

}

bool isMatch(const char *s, const char *p) {
assert(s && p);
if (*p == '\0') return *s == '\0';

// next char is not '*': must match current character
if (*(p+1) != '*') {
assert(*p != '*');
return ((*p == *s) || (*p == '.' && *s != '\0')) && isMatch(s+1, p+1);
}
// next char is '*'
while ((*p == *s) || (*p == '.' && *s != '\0')) {
if (isMatch(s, p+2)) return true;
s++;
}
return isMatch(s, p+2);
}

bool isMatch(const char *s, const char *p) {
int slen = strlen(s), plen = strlen(p), i, j;
bool dp[500][500];
memset(dp,false, sizeof(dp));
dp[0][0] = true;
for (i = 1; i <= plen; ++i) {
if (p[i] == '*') {
dp[i][0] = dp[i + 1][0] = dp[i - 1][0];
for (j = 1; j <= slen; ++j)
dp[i][j] = dp[i + 1][j] = (dp[i][j - 1] && (p[i - 1] == s[j - 1] || p[i - 1] == '.') || dp[i - 1][j]);
++i;
}
else
for (j = 1; j <= slen; ++j)
dp[i][j] = dp[i - 1][j - 1] && (p[i - 1] == s[j - 1] || p[i - 1] == '.');
}
return dp[plen][slen];
}

bool isMatch(const char *s, const char *p) {
// Start typing your C/C++ solution below
// DO NOT write int main() function

if ( !s || !p )
return !s&&!p;
int ns=strlen(s);
int np=strlen(p);
vector<vector<bool> > dp(ns+1,vector<bool>(np+1,0));
dp[0][0]=true;
for(int i=1;i<=ns;i++)
{
if ( s[i-1]=='*' )
{
assert(i>=2);
dp[i][0]=dp[i-2][0];
}
}
for(int j=1;j<=np;j++)
{
if ( p[j-1]=='*' )
{
assert(j>=2);
dp[0][j]=dp[0][j-2];
}
}
for(int i=1;i<=ns;i++)
{
for(int j=1;j<=np;j++)
{
if (s[i-1]=='.'||p[j-1]=='.')
dp[i][j]=dp[i-1][j-1];
else if ( s[i-1]=='*')
dp[i][j]=dp[i-1][j]||dp[i-2][j];
else if ( p[j-1]=='*')
dp[i][j]=dp[i][j-1]||dp[i][j-2]||(dp[i-1][j]&&(s[i-1]==p[j-2]||p[j-2]=='.'));
else
dp[i][j]=dp[i-1][j-1]&&s[i-1]==p[j-1];
}
}
return dp[ns][np];
} 

0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：173862次
• 积分：3968
• 等级：
• 排名：第8345名
• 原创：201篇
• 转载：56篇
• 译文：0篇
• 评论：21条
评论排行
最新评论
导航标签
http://zhedahht.blog.163.com/blog/#m=0 http://blog.csdn.net/v_july_v/article/details/6015165 程序员编程艺术：http://blog.csdn.net/v_JULY_v/article/details/6460494 剑指offer http://zhedahht.blog.163.com/blog/#m=0