给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。
'.' 匹配任意单个字符
'*' 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。
示例 1:
参考: 力扣
f(i,j)s的前i个字符和p的前j个字符是否能够匹配,
pj为字符,如果匹配则比对前一位置,不同则匹配无效
pj为*,如果和前一个匹配则匹配s的前一个字符(匹配成功看前一个)或者p去除前一个字母(不匹配这两个字符,但是由于*可以匹配0个所以可以跳过),不匹配则直接看j-2
匹配函数:相同或者='.'
特殊值:f[0][0]=true,f[i][0]=false
注意:动态规划是需要下标+1(因为要考虑空情况),在编写代码时注意两种下标的转换
class Solution {
public boolean isMatch(String s, String p) {
char[] ss=s.toCharArray(),ps=p.toCharArray();
int sl=ss.length,pl=ps.length;
boolean[][] f=new boolean[sl+1][pl+1];
f[0][0]=true;
for(int i=0;i<=sl;i++){
for(int j=1;j<=pl;j++){
if(ps[j-1]!='*'){
if(match(ss,ps,i,j)){
f[i][j]=f[i-1][j-1];
}
}
else{
if(match(ss,ps,i,j-1)){
f[i][j]=f[i-1][j]||f[i][j-2];
}else{
f[i][j]=f[i][j-2];
}
}
}
}
return f[sl][pl];
}
private boolean match(char[] ss,char[] ps,int i,int j){
if(i==0||j==0){
return false;
}
// .可以任意匹配
if(ps[j-1]=='.'){
return true;
}
return ss[i-1]==ps[j-1];
}
}