Problem 10:Regular Expression Matching
来源:互联网 发布:软件外包群 编辑:程序博客网 时间:2024/06/05 09:11
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
题解:
本文及代码引用自:http://www.cnblogs.com/springfor/p/3893593.html?utm_source=tuicool
- 首先要理解题意:
- "a"对应"a", 这种匹配不解释了
- 任意字母对应".", 这也是正则常见
- 0到多个相同字符x,对应"x*", 比起普通正则,这个地方多出来一个前缀x. x代表的是 相同的字符中取一个,比如"aaaab"对应是"a*b"
- "*"还有一个易于疏忽的地方就是它的"贪婪性"要有一个限度.比如"aaa"对应"a*a", 代码逻辑不能一路贪婪到底,所以在p.charAt(1)=='*'条件下,while在条件成立的情况下,s不能无限递减,需要判断isMatch(s,p.substring(2))是否成立,如果成立则返回true,最好的例子就是s="aaa",p="a*a"这个测试用例。
- 正则表达式如果期望着一个字符一个字符的匹配,是非常不现实的.而"匹配"这个问题,非 常容易转换成"匹配了一部分",整个匹配不匹配,要看"剩下的匹配"情况.这就很好的把 一个大的问题转换成了规模较小的问题:递归
- 确定了递归以后,使用java来实现这个问题,会遇到很多和c不一样的地方,因为java对字符 的控制不像c语言指针那么灵活charAt一定要确定某个位置存在才可以使用.
- 如果pattern是"x*"类型的话,那么pattern每次要两个两个的减少.否则,就是一个一个 的减少. 无论怎样减少,都要保证pattern有那么多个.比如s.substring(n), 其中n 最大也就是s.length()
solution代码:
/** * Created by liuyang on 2015/8/30. */public class Solution { public static boolean isMatch(String s, String p) { if (p.length() == 0) return s.length() == 0; // length == 1 is the case that is easy to forget. // as p is subtracted 2 each time, so if original // p is odd, then finally it will face the length 1 if (p.length() == 1){ return (s.length() == 1) && (p.charAt(0) == s.charAt(0) || p.charAt(0) == '.'); } // next char is not '*': must match current character if (p.charAt(1) != '*') { if (s.length() == 0) return false; else return (s.charAt(0) == p.charAt(0) || p.charAt(0) == '.') && isMatch(s.substring(1), p.substring(1)); }else{ // next char is * while (s.length() > 0 && (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)); } }}
0 0
- Problem 10:Regular Expression Matching
- 10、Regular Expression Matching
- 10,Regular Expression Matching
- 10Regular Expression Matching
- 10 Regular Expression Matching
- 10、Regular Expression Matching
- 10Regular Expression Matching
- 【10】Regular Expression Matching
- 10-Regular Expression Matching
- Regular Expression Matching (Leetcode hard algorithm problem)
- 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》
- 安卓ADT离线安装教程
- 富文本Html.fromHtml方法
- 常见问题总结篇 一 、Objective C 方法和 C方法的混合调用
- Merge k Sorted Lists
- static用途
- Problem 10:Regular Expression Matching
- 虚拟局域网技术详解
- Swift - 基本运算符
- 自己实现简单RPC功能
- 《剑指Offer》面试题:从尾到头打印链表
- SPFA
- CGI
- Toast(提示)
- css优化十大办法