[LeetCode] Regular Expression Matching
2015-07-05 23:40
281 查看
This problem has a typical solution using Dynamic Programming. We define the state P[i][j] to be true if s[0..i) matches p[0..j) and false otherwise. Then the state equations are:
P[i][j] = P[i - 1][j - 1], if p[j - 1] != '*' && (s[i - 1] == p[j - 1] || p[j - 1] == '.');
P[i][j] = P[i][j - 2], if p[j - 1] == '*' and the pattern repeats for 0 times;
P[i][j] = P[i - 1][j] && (s[i - 1] == p[j - 2] || p[j - 2] == '.'), if p[j - 1] == '*' and the pattern repeats for at least 1 times.
Putting these together, we will have the following code.
P[i][j] = P[i - 1][j - 1], if p[j - 1] != '*' && (s[i - 1] == p[j - 1] || p[j - 1] == '.');
P[i][j] = P[i][j - 2], if p[j - 1] == '*' and the pattern repeats for 0 times;
P[i][j] = P[i - 1][j] && (s[i - 1] == p[j - 2] || p[j - 2] == '.'), if p[j - 1] == '*' and the pattern repeats for at least 1 times.
Putting these together, we will have the following code.
class Solution { public: bool isMatch(string s, string p) { int m = s.length(), n = p.length(); vector<vector<bool> > dp(m + 1, vector<bool> (n + 1, false)); dp[0][0] = true; for (int i = 0; i <= m; i++) for (int j = 1; j <= n; j++) if (p[j - 1] == '*') dp[i][j] = dp[i][j - 2] || (i > 0 && (s[i - 1] == p[j - 2] || p[j - 2] == '.') && dp[i - 1][j]); else dp[i][j] = i > 0 && dp[i - 1][j - 1] && (s[i - 1] == p[j - 1] || p[j - 1] == '.'); return dp[m] ; } };
相关文章推荐
- 装饰模式(Decorator)
- LR11.50 通过Mobile Application 录制手机操作
- Linux下自定义开机启动程序
- 戒烟周报(第三周)
- HDU2553N皇后问题(BFS)
- 校内ACM上出现Presentation Error的一点经验
- UIImage imageNamed格式要求
- java -D参数简化加入多个jar【简化设置classpath】
- [转]《高性能MySQL》读书笔记--Schema与数据类型优化
- 区分const指针
- Codeforces 238E. Meeting Her 图论+记忆化搜索
- HDU4630:No Pain No Game(线段树)
- 快速傅里叶变换用于长整数相乘
- 2天驾驭DIV+CSS (技巧篇)(转)
- AngularJS自定义表单控件
- LR11.5 安卓模拟器性能测试
- 两个栈来实现一个队列的C++代码(某公司社会早笔试题)
- 2015070510 - 挑战失败
- mac下安装、配置nexus,构建maven私服
- IIR递归高斯滤波总结