Regular Expression Matching
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") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
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") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
isMatch("aab", "c*a*b") → true
这题难度为hard,最主要的实现方法是用递归方法,先判断边界条件,然后再判断p字符串中第二个字符时候为*,分情况讨论。
具体代码和注释如下:
public class Solution {
public boolean isMatch(String s, String p) {
if (s == null)
return p == null;
if (p == null)
return s == null;
int lenS = s.length();
int lenP = p.length();
if (lenP == 0)
return lenS == 0;
if(lenP == 1){
if(lenS == 1){
if(p.equals(".") || p.equals(s)){
return true;
}
}
return false;
}
//字符后为*
if(p.charAt(1) == '*'){
int i = 0;
while(s.length() > 0 && isEquals(s.charAt(0), p.charAt(0))){
//如果截取p的两位后还能匹配,则返回true,如果不能,s截取前i位后与p重新匹配
if(isMatch(s, p.substring(2)))
return true;
s = s.substring(1);
}
return isMatch(s.substring(i), p.substring(2));
}
//字符后不为*
else{
if(lenS > 0 && isEquals(s.charAt(0), p.charAt(0))){
return isMatch(s.substring(1), p.substring(1));
}
else{
return false;
}
}
}
//判断是否相等
public static boolean isEquals(char x, char y){
if(x == y || y == '.'){
return true;
}
return false;
}
}