LeetCode Wildcard Matching

来源:互联网 发布:图片软件下载 编辑:程序博客网 时间:2024/04/26 05:40

前面有一道http://oj.leetcode.com/problems/regular-expression-matching/ 和这题特别像的。

首先我是用回溯法,肯定时间是不够的,不知道有没有错误,leetCode的编译器错误也说是超时,如下:

bool isMatch(const char *s, const char *p) {if (*p==0){return *s==0;}if (*p!='*'){if (*s==*p||(*p=='?'&&*s!=0)){return isMatch(s+1,p+1);}elsereturn false;}else{const char*q = NULL;for (q=s;*q!=0;q++){if(isMatch(q,p+1)) return true;}return isMatch(q,p+1);}}
肯定是有DP的方法,自己的还是没通过,最关键的DP的核心部分写错了,for (int j=1,k=0;j<=lens;j++,k++)    dp[i][j] = dp[i-1][j-k]|dp[i-1][j-k-1];那样的分析一点逻辑也没有。而dp[i][j] = dp[i-1][j]|dp[i][j-1]; 这才是正确的,意思就是*可以作为选择也可以不参与选择(就是代表空字符)。有一点注意的是没有下面这几行优化的代码也是提交不过去,这点有点不够意思。

const char* tmp = p;  
int cnt = 0;  
while (*tmp != '\0') if (*(tmp++) != '*') cnt++;  
if (cnt > lens) return false;  

DP方法如下:

bool isMatch(const char *s, const char *p) {int lenp = strlen(p), lens = strlen(s);if (lenp==0)return lens==0;if (p[0]!='*'&&p[0]!='?'&&(lens>0&&p[0]!=s[0]))return false;const char* tmp = p;  int cnt = 0;  while (*tmp != '\0') if (*(tmp++) != '*') cnt++;  if (cnt > lens) return false;  bool dp[500][500];memset(dp,false,sizeof(dp));dp[0][0] = true;for (int i=1;i<=lens;i++){dp[0][i] = false;}for (int i=1;i<=lenp;i++){if (p[i-1]=='*')//'*' can represent empty stringdp[i][0] = dp[i-1][0];// 只有全是*时才是true,因为s此时为空,只有当前点为*,前面不为*,那么还是不能匹配elsedp[i][0] = false;}for (int i=1;i<=lenp;i++){if (p[i-1]!='*'){for (int j=1;j<=lens;j++){if (p[i-1]=='?'||s[j-1]==p[i-1]){dp[i][j] = dp[i-1][j-1];}elsedp[i][j] = false;}}else{for (int j=1;j<=lens;j++)//for (int j=1,k=0;j<=lens;j++,k++){dp[i][j] = dp[i-1][j]|dp[i][j-1];//this is right for you can tell the reason, whether put the '*' in it.but dp[i][j] = dp[i-1][j-k]|dp[i-1][j-k-1]; this is wrong }}}return dp[lenp][lens];}


0 0
原创粉丝点击