10. Regular Expression Matching

这妥妥的是一道hard题
肯定也是DP, 这种String matching的。
说实话,这种题,非常考基本功, 道理你都懂,看你能不能bug free的写出来了。

容易出的bug:

这种题经常要用offset by 1的trick,取char的时候记得要 用s.charAt(i -1)
这里帖了一个DP的代码

    public boolean isMatch(String s, String p) {
        boolean[][] dp = new boolean[s.length() + 1][p.length() + 1];
        for (int i = 0; i <= s.length(); i++) {
            for (int j = 0; j <= p.length(); j++) {
                if (j == 0) {
                    if (i == 0) dp[i][j] = true;
                    continue;
                }
                if (p.charAt(j - 1) == '.') {
                    if (i > 0) dp[i][j] = dp[i - 1][j - 1];
                } else if (p.charAt(j - 1) == '*' && j > 1 && p.charAt(j - 2) == '.'){
                    dp[i][j] = dp[i][j -2];
                    if (i > 0) dp[i][j] |= dp[i - 1][j];
                } else if (p.charAt(j - 1) == '*' && j > 1 && p.charAt(j - 2) != '.'){
                    dp[i][j] = dp[i][j - 2];
                    if (i > 0 && s.charAt(i - 1) == p.charAt(j - 2)) dp[i][j] |= dp[i - 1][j]; 
                } else {
                    if (i > 0 && s.charAt(i - 1) == p.charAt(j - 1)) dp[i][j] = dp[i - 1][j - 1];
                }
            }
        }
        return dp[s.length()][p.length()];
    }

楼主找时间再用recursion + memo写一遍再贴上来。
再唠叨一句,这道题如果做recursion, 经常思路是从前往后做。比如判断 abc vs abc*,先recursion 做bc vs bc*,再用后面的小一号问题来解决当前问题。 但这样就老费劲了。我写第一遍的时候,从前往后写的,写了 80多行,判断各种case, 深感这题太难。如果先判断,abc vs abc ,再判断 abc vs abc*就简单很多。因为*号是对前面字母的重复. 如果把*和前面的割开,*号出现在第一个,就不是合法expression,需要处理各种edge case。

你可能感兴趣的:(10. Regular Expression Matching)