[Leetcode 10, Hard] Regular Expression Matching
来源:互联网 发布:linux设置ip地址命令 编辑:程序博客网 时间:2024/05/01 19:56
Problem:
Implement regular expression matching with support for '.'
and '*'
.
'.' 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") → falseisMatch("aa","aa") → trueisMatch("aaa","aa") → falseisMatch("aa", "a*") → trueisMatch("aa", ".*") → trueisMatch("ab", ".*") → trueisMatch("aab", "c*a*b") → true
Analysis:
The solutions come from internet.
Solutions:
C++:
(1) DFS
bool isMatchAux(const char *s, const char *p) { if (!p[0]) return !s[0]; int slen = strlen(s), plen = strlen(p); if (plen == 1 || p[1] != '*') { return slen && (p[0] == '.' || s[0] == p[0]) && isMatchAux(s + 1, p + 1); } while (s[0] && (p[0] == '.' || s[0] == p[0])) { if (isMatchAux(s++, p + 2)) return true; } return isMatchAux(s, p + 2); } bool isMatch(string s, string p) { if (p.empty()) return s.empty(); if(p[0] == '*') return true; bool r = isMatchAux(s.c_str(), p.c_str()); return r; }(2) Dynamic programming:
bool isMatch(string s, string p) { /** * f[i][j]: if s[0..i-1] matches p[0..j-1] * if p[j - 1] != '*' * f[i][j] = f[i - 1][j - 1] && s[i - 1] == p[j - 1] * if p[j - 1] == '*', denote p[j - 2] with x * f[i][j] is true iff any of the following is true * 1) "x*" repeats 0 time and matches empty: f[i][j - 2] * 2) "x*" repeats >= 1 times and matches "x*x": s[i - 1] == x && f[i - 1][j] * '.' matches any single character */ int m = s.size(), n = p.size(); vector<vector<bool>> f(m + 1, vector<bool>(n + 1, false)); f[0][0] = true; for (int i = 1; i <= m; i++) f[i][0] = false; // p[0.., j - 3, j - 2, j - 1] matches empty iff p[j - 1] is '*' and p[0..j - 3] matches empty for (int j = 1; j <= n; j++) f[0][j] = j > 1 && '*' == p[j - 1] && f[0][j - 2]; for (int i = 1; i <= m; i++) for (int j = 1; j <= n; j++) if (p[j - 1] != '*') f[i][j] = f[i - 1][j - 1] && (s[i - 1] == p[j - 1] || '.' == p[j - 1]); else // p[0] cannot be '*' so no need to check "j > 1" here f[i][j] = f[i][j - 2] || (s[i - 1] == p[j - 2] || '.' == p[j - 2]) && f[i - 1][j]; return f[m][n]; }Java:
Python:
0 0
- [Leetcode 10, Hard] Regular Expression Matching
- leetcode hard模式专杀之10Regular Expression Matching
- LeetCode 10. Regular Expression Matching(hard)
- (Leetcode)10.Regular Expression Matching(hard)
- Leetcode 10. Regular Expression Matching (Hard) (cpp)
- Regular Expression Matching (Leetcode hard algorithm problem)
- Hard 10题 Regular Expression Matching
- Leetcode【10】:Regular Expression Matching
- [leetcode 10] Regular Expression Matching
- LeetCode(10) Regular Expression Matching
- [leetcode 10] Regular Expression Matching
- leetcode.10------------Regular Expression Matching
- [leetcode] 10 Regular Expression Matching
- [leetcode] 10 Regular Expression Matching
- LeetCode 10:《Regular Expression Matching》
- leetcode 10: Regular Expression Matching
- LeetCode 10 - Regular Expression Matching
- Leetcode #10 Regular Expression Matching
- Linux shell命令
- [Leetcode 30, Hard] Substring with Concatenation of All Words
- poj 3009 Curling2.0 回溯搜索
- 你了解实时计算吗?
- pipelined function
- [Leetcode 10, Hard] Regular Expression Matching
- Codeforces Gym 2015 ACM Arabella Collegiate Programming Contest
- warning: strtotime(): It is not safe to rely on the system's timezone settings
- 将Latex tex文档转换成 word文档(下)
- 1212
- Model ensembling
- Java学习笔记-------数据库疑问
- item-based algorithm
- Android NDK 实践(用C编写Android程序)