LeetCode – Regular Expression Matching in Java
来源:互联网 发布:求迅龙数据恢复注册码 编辑:程序博客网 时间:2024/05/16 11:19
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") return false
isMatch("aa","aa") return true
isMatch("aaa","aa") return false
isMatch("aa", "a*") return true
isMatch("aa", ".*") return true
isMatch("ab", ".*") return true
isMatch("aab", "c*a*b") return true
1. Analysis
First of all, this is one of the most difficulty problems. It is hard to think through all different cases. The problem should be simplified to handle 2 basic cases:
- the second char of pattern is "*"
- the second char of pattern is not "*"
For the 1st case, if the first char of pattern is not ".", the first char of pattern and string should be the same. Then continue to match the remaining part.
For the 2nd case, if the first char of pattern is "." or first char of pattern == the first i char of string, continue to match the remaining part.
2. Java Solution 1 (Short)
The following Java solution is accepted.
public class Solution { public boolean isMatch(String s, String p) { if(p.length() == 0) return s.length() == 0; //p's length 1 is special case if(p.length() == 1 || p.charAt(1) != '*'){ if(s.length() < 1 || (p.charAt(0) != '.' && s.charAt(0) != p.charAt(0))) return false; return isMatch(s.substring(1), p.substring(1)); }else{ int len = s.length(); int i = -1; while(i<len && (i < 0 || p.charAt(0) == '.' || p.charAt(0) == s.charAt(i))){ if(isMatch(s.substring(i+1), p.substring(2))) return true; i++; } return false; } }}
3. Java Solution 2 (More Readable)
public boolean isMatch(String s, String p) {// base caseif (p.length() == 0) {return s.length() == 0;} // special caseif (p.length() == 1) { // if the length of s is 0, return falseif (s.length() < 1) {return false;} //if the first does not match, return falseelse if ((p.charAt(0) != s.charAt(0)) && (p.charAt(0) != '.')) {return false;} // otherwise, compare the rest of the string of s and p.else {return isMatch(s.substring(1), p.substring(1));}} // case 1: when the second char of p is not '*'if (p.charAt(1) != '*') {if (s.length() < 1) {return false;}if ((p.charAt(0) != s.charAt(0)) && (p.charAt(0) != '.')) {return false;} else {return isMatch(s.substring(1), p.substring(1));}} // case 2: when the second char of p is '*', complex case.else {//case 2.1: a char & '*' can stand for 0 elementif (isMatch(s, p.substring(2))) {return true;} //case 2.2: a char & '*' can stand for 1 or more preceding element, //so try every sub stringint i = 0;while (i<s.length() && (s.charAt(i)==p.charAt(0) || p.charAt(0)=='.')){if (isMatch(s.substring(i + 1), p.substring(2))) {return true;}i++;}return false;}}
- LeetCode – Regular Expression Matching in Java
- LeetCode – Regular Expression Matching in Java
- Regular Expression Matching in Java
- [Leetcode] Regular Expression Matching (Java)
- Regular Expression Matching Leetcode Java
- [LeetCode][Java] Regular Expression Matching
- LeetCode : Regular Expression Matching [java]
- leetcode Regular Expression Matching(Java)
- LeetCode: Regular Expression Matching
- LeetCode: Regular Expression Matching
- leetcode Regular Expression Matching
- [Leetcode] Regular Expression Matching
- [LeetCode]Regular Expression Matching
- LeetCode-Regular Expression Matching
- Regular Expression Matching LeetCode
- LeetCode | Regular Expression Matching
- LeetCode: Regular Expression Matching
- Leetcode: Regular Expression Matching
- 最新IOS开发教程学习2015(一)
- 浅谈C语言嵌入式系统编程注意事项
- [退役录](此为从QQ空间复制过来的)
- 原在Mac下配置php开发环境:Apache+php+MySql
- Leetcode 之 Maximum Subarray
- LeetCode – Regular Expression Matching in Java
- mysql实现文章上一篇下一篇的sql语句
- IOS UIScrollView的自动布局
- POJ 3279 Fliptile
- 最长上升子序列
- 【leetcode】Min Stack
- 如何搭建Hibernate4项目
- LeetCode 2_Add Two Numbers
- 初学者之php基础(一)