题目链接

牛客网

题目描述

请实现一个函数用来匹配包括 ’ . ’ 和 ’ * ’ 的正则表达式。模式中的字符 ‘.’ 表示任意一个字符,而 ‘*’ 表示它前面的字符可以出现任意次(包含 0 次)。

在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串 “aaa” 与模式 “a.a” 和 “abaca” 匹配,但是与 “aa.a” 和 “ab*a” 均不匹配。

解题思路

dp[i][j]表示str到i长度的子字符串和pattern到j长度的正则表达式是否匹配

public class Solution {
   
    public boolean match(char[] str, char[] pattern){
   
        int m = str.length, n = pattern.length;
        boolean[][] dp = new boolean[m+1][n+1];
        // 初始化dp
        dp[0][0] = true;
        for (int j=1;j<=n;j++) {
   
            if (pattern[j-1]=='*') dp[0][j] = dp[0][j-2];
        }
        for (int i=1;i<=m;i++) {
   
            for (int j=1;j<=n;j++) {
   
                if (str[i-1]==pattern[j-1] || pattern[j-1]=='.') 
                    dp[i][j] = dp[i-1][j-1];
                else if (pattern[j-1]=='*') {
   
                    if (j>=2 && (str[i-1]==pattern[j-2]) || pattern[j-2]=='.') {
   
                        dp[i][j] |= dp[i][j-2]; // a*当做空
                        dp[i][j] |= dp[i][j-1]; // a*当做a
                        dp[i][j] |= dp[i-1][j]; // a*当做多个a,与去掉最后一个字符的str比较
                    } else if (j>=2) {
   
                        dp[i][j] = dp[i][j-2];
                    } else dp[i][j] = false;
                } else dp[i][j] = false;
            }
        }
        return dp[m][n];
    }
}