LeetCode Regular Expression Matching 网上一个不错的实现(非递归)
'.' Matches any single character.
'*' Matches zero or more of the preceding element.
The matching should cover the entire input string (not partial).
The function prototype should be:
bool isMatch(const char *s, const char *p)
Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
isMatch("aab", "c*a*b") → true
以下是牛人的实现:
class Solution { public: bool isMatch(string s, string p) { int i, j; int m = s.size(); int n = p.size(); const char *s1 = s.c_str(); const char *p1 = p.c_str(); /** * b[i + 1][j + 1]: if s[0..i] matches p[0..j] * if p[j] != '*' * b[i + 1][j + 1] = b[i][j] && s[i] == p[j] * if p[j] == '*', denote p[j - 1] with x, * then b[i + 1][j + 1] is true iff any of the following is true * 1) "x*" repeats 0 time and matches empty: b[i + 1][j -1] * 2) "x*" repeats 1 time and matches x: b[i + 1][j] * 3) "x*" repeats >= 2 times and matches "x*x": s[i] == x && b[i][j + 1] * '.' matches any single character */ bool b[m + 1][n + 1]; b[0][0] = true; for (i = 0; i < m; i++) { b[i + 1][0] = false; } // p[0..j - 2, j - 1, j] matches empty iff p[j] is '*' and p[0..j - 2] matches empty for (j = 0; j < n; j++) { b[0][j + 1] = j > 0 && '*' == p1[j] && b[0][j - 1]; } for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { if (p[j] != '*') { b[i + 1][j + 1] = b[i][j] && ('.' == p1[j] || s1[i] == p1[j]); } else { b[i + 1][j + 1] = b[i + 1][j - 1] && j > 0 || b[i + 1][j] || b[i][j + 1] && j > 0 && ('.' == p1[j - 1] || s1[i] == p1[j - 1]); } } } return b[m][n]; } };
这应该是用动态规划的方法实现的。
learn++