1 原题
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
2 题目理解
给定一个正则表达式,和一个字符串,判断其是否匹配
规则很简单:
1、”.“ 匹配任意单个字符
2、一个其余字符如果跟着*,那么可以匹配0~n个,如果没有跟着的话就只能匹配自身
解题方式:
递归求解
遇到.和没有*的直接匹配
遇到*,每次都分跳过和匹配两种
详细的看我代码备注
3 AC解
/**
*
* 这个解法是递归,记住规则,两个指针分别指向两个串:
* 1、首先检测是否有*存在,有*存在要分开两种状况,1是有*
* a、*前面的字符匹配了(.或完全相等),那么分别递归两种情况,第一个就是匹配了当前字符,正则还停留在*这里,第二个则是b
* b、跳过*,不匹配,或者说空匹配
* 2、如果没有*
* a、如果当前位置匹配了,那么继续向后匹配
* b、直接gameover
* 3、如果两个串都到了终点,证明匹配完全,返回true
* 4、如果有一方已经到达了终点,证明没匹配完全,此时:
* a、如果pattern正则式那边后面还有若干*的字符,那么先跳过这些*的匹配,因为可以空匹配
* b、当全部跳过后,如果p还没到终点,那么就证明无法匹配,反之二者匹配
* */
public class Solution {
char[] subject;
char[] pattern;
int slen,plen;
public boolean check(int si,int pi){
if(si==slen && pi==plen) // 匹配3
return true;
if(si<slen && pi<plen){
if(pi<plen-1 && pattern[pi+1]=='*'){
boolean same=false;
if(pattern[pi]=='.' || pattern[pi]==subject[si])
same=true;
boolean flag=false;
if(same)
flag=check(si+1,pi); // 匹配1.a
if(flag==false)
flag=check(si,pi+2); // 匹配1.b
return flag;
} else{
if(pattern[pi]=='.' || pattern[pi]==subject[si])
return check(si+1,pi+1);//匹配2.a
return false; //匹配2.b
}
}
else{
while (pi<plen-1 && pattern[pi+1]=='*'){ //处理4的状况
pi+=2;
}
if(si==slen && pi==plen) //匹配4.a处理 4.2b后pattern达到终点
return true;
return false;//匹配4.a处理 4.2b后pattern也没有达到终点
}
}
public boolean isMatch(String s, String p) {
slen=s.length();
plen=p.length();
subject=s.toCharArray();
pattern=p.toCharArray();
return check(0,0);
}
}