LeetCode-10. Regular Expression Matching [C++][Java]

LeetCode-10. Regular Expression Matchingicon-default.png?t=M276https://leetcode.com/problems/regular-expression-matching/

题目描述

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

  • '.' Matches any single character.​​​​
  • '*' Matches zero or more of the preceding element.

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

Example 1:

Input: s = "aa", p = "a"
Output: false
Explanation: "a" does not match the entire string "aa".

Example 2:

Input: s = "aa", p = "a*"
Output: true
Explanation: '*' means zero or more of the preceding element, 'a'. Therefore, by repeating 'a' once, it becomes "aa".

Example 3:

Input: s = "ab", p = ".*"
Output: true
Explanation: ".*" means "zero or more (*) of any character (.)".

Constraints:

  • 1 <= s.length <= 20
  • 1 <= p.length <= 30
  • s contains only lowercase English letters.
  • p contains only lowercase English letters, '.', and '*'.
  • It is guaranteed for each appearance of the character '*', there will be a previous valid character to match.

解题思路

【C++】

1. 动态规划

class Solution {
public:
    bool isMatch(string s, string p) {
        int m = s.size(), n = p.size();
        vector<vector<bool>> dp(m +1, vector<bool>(n + 1, false));
        dp[0][0] = true;
        for (int i = 1; i < n + 1; ++i) {
            if (p[i-1] == '*') {
                dp[0][i] = dp[0][i-2];
            }
        }
        for (int i = 1; i <= m; ++i) {
            for (int j = 1; j <= n; ++j) {
                if (p[j-1] == '.') {
                    dp[i][j] = dp[i-1][j-1];
                } else if (p[j-1] != '*') {
                    dp[i][j] = dp[i-1][j-1] && s[i-1] == p[j-1];
                } else if (p[j-2] != s[i-1] && p[j-2] != '.') {//p[j-1] = '*'
                    dp[i][j] = dp[i][j-2];
                } else { //p[j-1] == '*' && (s[i-1] == p[j-2] || p[j-2] == '.')
                    dp[i][j] = dp[i][j-1] || dp[i][j-2] || dp[i-1][j];
                }
            }
        }
        return dp[m][n];
    }
};

2. 递归

class Solution {
public:
    bool isMatch_i(string &s, string &p, int start_s, int start_p) {
        int si = start_s, pi = start_p;
        while (pi < p.length()) {
            if (pi + 1 < p.length() && p[pi+1] == '*') {
                if (p[pi] == '*') {return false;}
                while (si < s.length() && (s[si] == p[pi] || p[pi] == '.')) {
                    if (isMatch_i(s, p, si, pi+2)) {return true;}
                    si++;
                }
                if(isMatch_i(s, p, si, pi+2)) {return true;}
                return false;
            } else if (si==s.length()) {return false;}
            else if (s[si]==p[pi] || p[pi]=='.') {
                si++;
                pi++;
            } else {return false;}
        }
        return (si==s.length());
    }

    bool isMatch(string s, string p) {
        return isMatch_i(s, p, 0, 0);
    }
};

【Java】

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贫道绝缘子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值