码迷,mamicode.com
首页 > 其他好文 > 详细

正则表达式匹配(剑指offer_19)

时间:2019-12-29 14:50:40      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:正则表达式   pre   ++   ret   表示   出现   lse   span   tip   

题目描述


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

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

解题思路


应该注意到,‘.‘ 是用来做一个任意字符,而 ‘*‘ 是用来重复前面的字符。 这两个的作用不同,不能把 ‘.‘ 的作用和 ‘*‘ 进行类比,从而把它当成重复前面字符一次。

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]; // a* counts as single a
                    dp[i][j] |= dp[i - 1][j]; // a* counts as multiple a
                    dp[i][j] |= dp[i][j - 2]; // a* counts as empty
                } else
                    dp[i][j] = dp[i][j - 2];   // a* only counts as empty

    return dp[m][n];
}

正则表达式匹配(剑指offer_19)

标签:正则表达式   pre   ++   ret   表示   出现   lse   span   tip   

原文地址:https://www.cnblogs.com/ziytong/p/12114952.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!