Skip to content
On this page

10. 正则表达式匹配

原题链接:LeetCode 10. 正则表达式匹配

题目描述

给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.''*' 的正则表达式匹配。

- `'.'` 匹配任意单个字符

- `'*'` 匹配零个或多个前面的那一个元素

所谓匹配,是要涵盖 **整个 **字符串 s 的,而不是部分字符串。

示例 1:

**输入:**s = "aa", p = "a" **输出:**false 解释:"a" 无法匹配 "aa" 整个字符串。

示例 2:

**输入:*s = "aa", p = "a" **输出:**true **解释:**因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。

示例 3:

**输入:**s = "ab", p = "." **输出:**true 解释:"." 表示可匹配零个或多个('*')任意字符('.')。

提示:

- `1 <= s.length <= 20`

- `1 <= p.length <= 20`

- `s` 只包含从 `a-z` 的小写字母。

- `p` 只包含从 `a-z` 的小写字母,以及字符 `.` 和 `*`。

- 保证每次出现字符 `*` 时,前面都匹配到有效的字符

难度: Hard


题解代码

javascript
/**
 * @param {string} s
 * @param {string} p
 * @return {boolean}
 */
const isMatch = (s, p) => {
    // 边界情况,如果 s 和 p 都为空,说明处理结束了,返回true,否则返回false 
    if (p.length <=0) {
        return !s.length
    }
    // 判断 p 模式字符串都第一个字符和 s 字符串都第一个字符是不是匹配
    let match = false

    if (s.length > 0 && (p[0] === s[0] || p[0] === '.')) {
        match = true
    }
    // p 有模式的
    if (p.length > 1 && p[1] === '*' ) {
        // 第一种情况--匹配0个字符,砍掉p的前2位继续验证
        // 第二种情况--匹配一个字符,砍掉s的第一位继续验证
        // 这两种情况有一种返回true,说明匹配成功
        return isMatch(s, p.slice(2)) || (match && isMatch(s.slice(1), p))
    } else {
        return match && isMatch(s.slice(1), p.slice(1))
    }
};

技术文档集合