leetcode Regular Expression Matching

2014-11-24 02:27:47 · 作者: · 浏览: 1
This problem is a good contrast to Wildcard Matching. Both DP and recursive program could finish it except greedy algorithm.
DP:
class Solution {  
 public:  
  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];  
  }  
};  

recursive:
class Solution {  
 public:  
  bool isMatch(const char *s, const char *p) {  
    if (*p == '\0')  
      return *s == '\0';  
    if (*(p + 1) == '*') {  
      for (const char *str = s; (*str == *p || *p == '.' && *str); ++str)   
        if(isMatch(str + 1, p + 2))  
          return true;  
      return isMatch(s, p + 2);  
    }    
    else  
      return (*p == *s || *p == '.' && *s) && isMatch(s + 1, p + 1);  
  }  
};