这一题比较经典,可以说力扣上的题都很经典,所以为了谨防我日后忘记此题,特写此博文来记忆。此代码已经过验证,可以通过

public class Why {
    public static void main(String[] args) {
        boolean b=regex("aa","a.");
        System.out.println(b);
    }
    public static boolean regex(String s,String p){
        int m=s.length();
        int n=p.length();
        boolean[][] b=new boolean[m+1][n+1];
        b[0][0]=true;
//这里j从1开始的原因是,j=0是没必要,因为都是false,i从1开始是有*号,它有true的情况
for (int i = 0; i <=m ; i++) {   //这里为什么要从0开始呢,它有个*号,要根据前两个来判断,所以不能省略从1开始,(题目不会一开始就输入*,此情况我们不考虑) for (int j = 1; j <=n; j++) { //这里为什么要从1开始呢,首先我设置的数组中j代表的是列(当然也可以设置为行),因为反正第一列出来第一个,它都是0 if (p.charAt(j-1)=='*'){ b[i][j]=b[i][j-2];    //遇到*,先看前两列的那个,是T则T if (matches(s,p,i,j-1)){ b[i][j]=b[i][j]||b[i-1][j]; //若前2列为F,则看它是否和*前面的字符相等 } }else { if (matches(s,p,i,j)){ b[i][j]=b[i-1][j-1]; //将它规划给它的子序列 } } } } return b[m][n]; } public static boolean matches(String s,String p,int i,int j){ if (i==0){ return false; } if (p.charAt(j-1)=='.'){ return true; } return s.charAt(i-1)==p.charAt(j-1); } }

有图有真相,能用图解释的就不废话。

力扣 NO.10正则表达式匹配_数组

 

 力扣上的这人讲得很好,由于种种原因,我在这里也不能讲解详细,反正我是理解了。发现表格的规律,将它转换成代码

 

力扣 NO.10正则表达式匹配_i++_02