和我一起迎接明天的太阳吧

klaus08

焦虑源于行动的匮乏

JZ52 正则表达式匹配

原题链接


描述

请实现一个函数用来匹配包括'.'和''的正则表达式。模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配。


示例

输入:"aaa","a*a"
返回值:true

思路

动态规划可太难了。


解答

public class Solution {
    public boolean match(String str, String pattern) {
        int m = str.length() + 1;
        int n = pattern.length() + 1;

        boolean[][] dp = new boolean[m][n];
        // 初始化
        dp[0][0] = true;
        for (int j = 2; j < n; j += 2)
            dp[0][j] = dp[0][j - 2] && pattern.charAt(j - 1) == '*';

        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (pattern.charAt(j - 1) == '*') {
                    dp[i][j] = dp[i][j - 2] ||
                            dp[i - 1][j] && (str.charAt(i - 1) == pattern.charAt(j - 2) ||
                                    pattern.charAt(j - 2) == '.');

                } else {
                    dp[i][j] = dp[i - 1][j - 1] &&
                            (pattern.charAt(j - 1) == '.' ||
                                    str.charAt(i - 1) == pattern.charAt(j - 1));
                }
            }
        }
        return dp[m - 1][n - 1];
    }
}
posted @ 2021-09-03 23:08  klaus08  阅读(36)  评论(0编辑  收藏  举报