leetcode 10 正则表达式匹配

leetcode 10 正则表达式匹配_第1张图片

这是遇到的第一个困难题,自己先写了一遍,结果被边界条件绕晕了,不过和递归方法的思想还是一致的。关键点就在于*,*可以匹配0次或多次,放在递归条件里,每一步判断,其实就是匹配或者不匹配。

递归方法解法如下:

class Solution {

    public boolean isMatch(String s, String p) {

        if (p.isEmpty()) {

            return s.isEmpty();

        }

        boolean firstMatch = !s.isEmpty() && (s.charAt(0) == p.charAt(0)

            || p.charAt(0) == '.');


        if (p.length() >= 2 && p.charAt(1) == '*') {

            return (firstMatch && isMatch(s.substring(1), p)) 

                || isMatch(s, p.substring(2)); 

        } else {

            return firstMatch && isMatch(s.substring(1), p.substring(1));

        }

    }

}

下面还会看下动态规划的解法,动态规划在于找到临界点和迭代表达式,这里的dp[i][j]代表第i位和第j位以后的字符串是够匹配,i代表s的下标,j代表p的下标。

class Solution {

    public boolean isMatch(String s, String p) {

        boolean[][] dp = new boolean[s.length() + 1][p.length() + 1];

        dp[s.length()][p.length()] = true;

        for (int i = s.length(); i >= 0; i--) {

            for (int j = p.length() - 1; j >= 0; j--) {

                boolean firstMatch = i < s.length() && (s.charAt(i) == p.charAt(j) || p.charAt(j) == '.');

                if (j + 1 < p.length() && p.charAt(j + 1) == '*') {

                    dp[i][j] = dp[i][j + 2] || firstMatch && dp[i + 1][j];      

                } else {

                    dp[i][j] = firstMatch && dp[i + 1][j + 1];

                }    

            }        

        }

        return dp[0][0]; 

    }

}

你可能感兴趣的:(leetcode 10 正则表达式匹配)