Regular Expression Matching
来源:互联网 发布:python 2 3区别 编辑:程序博客网 时间:2024/06/14 11:36
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
这道题明显运用递归算法,但是想编码还是要特别分析题目含义,找到递归公式。
如果P[j+1]!='*',S[i] == P[j]=>匹配下一位(i+1, j+1),S[i]!=P[j]=>匹配失败;
如果P[j+1]=='*',S[i]==P[j]=>匹配下一位(i+1, j+2)或者(i, j+2),S[i]!=P[j]=>匹配下一位(i,j+2)。
匹配成功的条件为S[i]=='\0' && P[j]=='\0'。
当用java去实现发现没有用c中指针那么方便。S[i]=='\0' 判断改用S.length()关系判断。还需要单独考虑长度为奇数情况。java实现没有C那么快,递归去求字符串的子串非常消耗时间。
public class Solution { public boolean isMatch(String s, String p) {if (p.length() ==0) {return s.length()==0;}//长度减2,如果开始为奇数则需要考虑到长度为1情况if (p.length() == 1)return (s.length() == 1)&& (p.charAt(0) == s.charAt(0) || p.charAt(0) == '.');if (p.charAt( 1) == '*') {while (s.length()>0&& (s.charAt(0) == p.charAt(0) || p.charAt(0) == '.')) {if (isMatch(s, p.substring(2)))return true;s = s.substring(1);}return isMatch(s, p.substring(2));} else {if (s.length()>0 && (s.charAt(0) == p.charAt(0) || p.charAt(0) == '.')){return isMatch(s.substring(1), p.substring(1));}}return false;}}
C代码则比较清晰明了一些:
class Solution {public: bool isMatch(const char *s, const char *p) { // Start typing your C/C++ solution below // DO NOT write int main() function if (*p == '\0') { return *s == '\0'; } if (*(p + 1) == '*') { while (*s != '\0' && (*s == *p || *p == '.')) { if (isMatch(s, p + 2)) { return true; } s++; } return isMatch(s, p + 2); } else {if (*s != '\0' && (*s == *p || *p == '.')) {return isMatch(s + 1, p + 1);} } return false; }};
参考:http://blog.csdn.net/pickless/article/details/9043389 感谢。
0 0
- LeetCode: Regular Expression Matching
- LeetCode: Regular Expression Matching
- leetcode Regular Expression Matching
- [Leetcode] Regular Expression Matching
- Regular Expression Matching
- Regular Expression Matching
- [LeetCode]Regular Expression Matching
- Regular Expression Matching
- LeetCode-Regular Expression Matching
- Regular Expression Matching
- Regular Expression Matching LeetCode
- Regular Expression Matching
- LeetCode | Regular Expression Matching
- LeetCode: Regular Expression Matching
- Leetcode: Regular Expression Matching
- [LeetCode] Regular Expression matching
- [LeetCode] Regular Expression Matching
- LeetCode Regular Expression Matching
- Codeforces 4C (STL map)
- 如何在ADF页面中显示警告信息?
- ADF与JSF的区别
- Java为什么要使用内部类?
- 使用github之:Git分支管理策略
- Regular Expression Matching
- ADF工具类:JSFUtil.java 源代码
- Chrome插件开发
- 程序员生存定律-六个程序员的故事(1)
- java中关于Map的九大问题
- Windows7部署Android开发环境实战图
- Fragment在Android中的使用
- vim tab设置为4个空格
- ADF工具类:ADFUtil.java 源代码