题目描述:
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。
'.' 匹配任意单个字符
'*' 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。
说明:
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *
相较于判断两个字符串是否相同,无非是多了两个字符来表示特殊情况,尤其是*,*可以代表多个前一个字符。所以每次只需比较后n个字符即可。容易想到的方法就是递归。只需注意特殊情况即可。
class Solution {
private String str ="";
private String pt = "";
public boolean isMatch(String s, String p) {
if(s.equals(p)){
return true;
}
if(p.equals("")){
return false;
}
str = s;
pt = p;
return match(0,0);
}
public boolean match(int index1,int index2){
boolean last1 = index1>=str.length();
boolean last2 = index2>=pt.length();
if (last1 && last2) {
return true;
}
if (!last1 && last2) {
return false;
}
if(index2+1<pt.length()&&pt.charAt(index2+1)=='*'){
//当s是最后一个字符而p的下一个字符是*时
if(last1){
return match(index1,index2+2);
}
//当s的当前字符和p的字符匹配,但p的下一个字符是*号时有两种情况,*为空或*代表下一个
//字符
if(str.charAt(index1)==pt.charAt(index2)||pt.charAt(index2)=='.'){
return match(index1+1,index2)||match(index1,index2+2);
}else{
return match(index1,index2+2);
}
}
if (last1 && !last2) {
return false;
}
if(str.charAt(index1)==pt.charAt(index2)||pt.charAt(index2)=='.'){
return match(index1+1,index2+1);
}
return false;
}
}