LeetCode 10. Regular Expression Matching

LeetCode 10. Regular Expression Matching

Description

Given an input string (s) and a pattern (p), implement regular expression matching with support for'.'and'*'.

‘.’ Matches any single character.
‘*’ Matches zero or more of the preceding element.

The matching should cover the entire input string (not partial).

Note

  • scould be empty and contains only lowercase letters a-z.
  • p could be empty and contains only lowercase letters a-z, and characters like . or *.

Example

在这里插入图片描述

Code

  • java
class Solution {
    public boolean isMatch(String s, String p) {
        char[] str1 = s.toCharArray();
        char[] str2 = p.toCharArray();
        int len1 = str1.length, len2 = str2.length;
        return isMatchCore(str1, 0, len1, str2, 0, len2);
    }
    public boolean isMatchCore(char[] str1, int cur1, int len1, char[] str2, int cur2, int len2) {
        if(cur1 == len1 && cur2 == len2) return true;
        else if(cur2 == len2) return false;
        boolean result = false;
        if(cur2 + 1 < len2 && str2[cur2+1] == '*') {
            if(cur1 < len1 && (str2[cur2] == '.' || str1[cur1] == str2[cur2])) {
                result = isMatchCore(str1, cur1+1, len1, str2, cur2, len2) || isMatchCore(str1, cur1, len1, str2, cur2+2, len2) || isMatchCore(str1, cur1+1, len1, str2, cur2+2, len2);
            } else {
                result = isMatchCore(str1, cur1, len1, str2, cur2+2, len2);
            }
        } else if(cur1 < len1 && (str1[cur1] == str2[cur2] || str2[cur2] == '.')) {
            result = isMatchCore(str1, cur1+1, len1, str2, cur2+1, len2);
        }
        return result;
    }
}
  • Official solution1
class Solution {
    public boolean isMatch(String text, String pattern) {
        if (pattern.isEmpty()) return text.isEmpty();
        boolean first_match = (!text.isEmpty() &&
                               (pattern.charAt(0) == text.charAt(0) || pattern.charAt(0) == '.'));

        if (pattern.length() >= 2 && pattern.charAt(1) == '*'){
            return (isMatch(text, pattern.substring(2)) ||
                    (first_match && isMatch(text.substring(1), pattern)));
        } else {
            return first_match && isMatch(text.substring(1), pattern.substring(1));
        }
    }
}
  • Official solution2(Dynamic Programming)
//O(len1*len2)
class Solution {
    public boolean isMatch(String text, String pattern) {
        boolean[][] dp = new boolean[text.length() + 1][pattern.length() + 1];
        dp[text.length()][pattern.length()] = true;

        for (int i = text.length(); i >= 0; i--){
            for (int j = pattern.length() - 1; j >= 0; j--){
                boolean first_match = (i < text.length() &&
                                       (pattern.charAt(j) == text.charAt(i) ||
                                        pattern.charAt(j) == '.'));
                if (j + 1 < pattern.length() && pattern.charAt(j+1) == '*'){
                    dp[i][j] = dp[i][j+2] || first_match && dp[i+1][j];
                } else {
                    dp[i][j] = first_match && dp[i+1][j+1];
                }
            }
        }
        return dp[0][0];
    }
}

Conclusion

  • 之前做过剑指 offer上的这题,然后递归时间复杂度高,后来参考了官方解答,动态规划牛逼(破音)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值