JZ-052-正規表示式匹配

雄獅虎豹發表於2022-01-16

正規表示式匹配

題目描述

請實現一個函式用來匹配包括'.'和''的正規表示式。模式中的字元'.'表示任意一個字元,而''表示它前面的字元可以出現任意次(包含0次)。

  • 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串"aaa"與模式"a.a"和"abaca"匹配,但是與"aa.a"和"ab*a"均不匹配。

題目連結: 正規表示式匹配

程式碼

/**
 * 標題:正規表示式匹配
 * 題目描述
 * 請實現一個函式用來匹配包括'.'和'*'的正規表示式。模式中的字元'.'表示任意一個字元,而'*'表示它前面的字元可以出現任意次(包含0次)。
 * 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串"aaa"與模式"a.a"和"ab*ac*a"匹配,但是與"aa.a"和"ab*a"均不匹配
 * 題目連結:
 * https://www.nowcoder.com/practice/45327ae22b7b413ea21df13ee7d6429c?tpId=13&&tqId=11205&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
 */
public class Jz52 {

    public boolean match(char[] str, char[] pattern) {
        int m = str.length, n = pattern.length;
        boolean[][] dp = new boolean[m + 1][n + 1];

        dp[0][0] = true;
        for (int i = 1; i <= n; i++) {
            if (pattern[i - 1] == '*') {
                dp[0][i] = dp[0][i - 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 (pattern[j - 2] == str[i - 1] || pattern[j - 2] == '.') {
                        dp[i][j] |= dp[i][j - 1];
                        dp[i][j] |= dp[i - 1][j];
                        dp[i][j] |= dp[i][j - 2];
                    } else {
                        dp[i][j] = dp[i][j - 2];
                    }
                }
            }
        }

        return dp[m][n];
    }

    public static void main(String[] args) {
        Jz52 jz52 = new Jz52();
        System.out.println(jz52.match("aaa".toCharArray(), "a*a".toCharArray()));
    }
}
【每日寄語】 請你再悄悄地努力一下,但願有一天你可以說出那句話,我終於成為了不負眾望的人了。

相關文章