10. Regular Expression Matching
来源:互联网 发布:java聊天室项目 编辑:程序博客网 时间:2024/06/07 17:01
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
一个简单的正则匹配规则,一开始向直接通过Pattern和Mathcer用法匹配,提交提示找不到Pattern估计是被过滤了。如下所示:class Solution { public boolean isMatch(String s, String p) { Pattern pattern = Pattern.compile(p); Matcher matcher = pattern.matcher(s); if (matcher.find()){ return true; } return false; }}
因为上述方式不能AC(都不能编译通过),当然只是想看看能否直接使用正则表达式,也知道通过正则表达式匹配也不是本题的用意,下面给出能够AC的代码,但是这种方式效率较低,后续再优化吧。
class Solution { public boolean isMatch(String s, String p) { if (p.isEmpty()) { return s.isEmpty(); } if (p.length() == 1 || p.charAt(1) != '*') { if (s.isEmpty() || (p.charAt(0) != '.' && p.charAt(0) != s.charAt(0))) { return false; } else { return isMatch(s.substring(1), p.substring(1)); } } while (!s.isEmpty() && (p.charAt(0) == '.'||s.charAt(0) == p.charAt(0))) { if (isMatch(s, p.substring(2))) { return true; } s = s.substring(1); } return isMatch(s, p.substring(2)); }}
本题还有一种更为简单的解法,即DP实现,思路见第44题分析,程序如下所示:
class Solution { public boolean isMatch(String s, String p) { int sLen = s.length(), pLen = p.length(); boolean[][] dp = new boolean[pLen+1][sLen+1]; dp[0][0] = true; for (int j = 1; j <= pLen; ++ j){ if (p.charAt(j-1) == '*'){ dp[j][0] = j >= 2&&dp[j-2][0]; } } for (int i = 1; i <= pLen; ++ i){ for (int j = 1; j <= sLen; ++ j){ if (p.charAt(i-1) == '.'||p.charAt(i-1) == s.charAt(j-1)){ dp[i][j] = dp[i-1][j-1]; } else if (i>=2&&p.charAt(i-1) == '*'){ if (p.charAt(i-2) == s.charAt(j-1)||p.charAt(i-2) == '.'){ dp[i][j] = dp[i][j-1]||dp[i-1][j]||(i >= 2&&dp[i-2][j]); } else { dp[i][j] = dp[i-2][j]; } } } } return dp[pLen][sLen]; }}
阅读全文
0 0
- 10. Regular Expression Matching
- 10.Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- 挑战程序竞赛系列(77):4.3 2-SAT(1)
- 缩写总结
- 1036跟着奥巴马一起学编程(逻辑题)
- link exe error
- 成员函数的重载、覆盖、隐藏 和 虚函数
- 10. Regular Expression Matching
- react-native学习之路4-设置类似于安卓里面的GridView的布局
- python之闭包
- Hibernate搭建开发环境+简单实例(二)
- c++ 合并两个无序的单链表使其仍为无序
- 笔记
- 文章标题
- Python 函数修饰符(装饰器)的学习
- c++二分查找实现(非递归和递归方式)