题解 | 正则表达式匹配

正则表达式匹配

https://www.nowcoder.com/practice/28970c15befb4ff3a264189087b99ad4

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param str string字符串
 * @param pattern string字符串
 * @return bool布尔型
 */
function match(str, pattern) {
    // write code here
    const m = pattern.length;
    const n = str.length;
    // 用当前正则去匹配空字符串
    const dp = Array.from({ length: m + 1 }, () =>
        new Array(n + 1).fill(false)
    );

    // str 是空字符串的时候
    dp[0][0] = true;
    for (let i = 1; i <= m; i++) {
        // .*可以匹配任意个,也可以匹配空字符串
        if (pattern[i - 1] === "*") {
            dp[i][0] = dp[i - 2][0];
        }
    }
    // pattern 是空字符串的时候,都是false
    for (let i = 1; i <= m; i++) {
        for (let j = 1; j <= n; j++) {
            // 可以匹配0个或者多个
            if (pattern[i - 1] === "*") {
                dp[i][j] = dp[i - 2][j]; // 匹配0个

                // 匹配1个至多个
                let l = j;
                // l位置就是匹配到的,l和i -1 位置匹配到了,就需要取得dp[i - 2][l - 1]的结果
                // 就需要获取pattern[i - 2]位置的字符和str[l - 1]位置的字符是否匹配
                while (
                    (pattern[i - 2] === '.' || pattern[i - 2] === str[l - 1]) 
                    && l > 0
                ) {
                    dp[i][j] = dp[i][j] || dp[i - 2][l - 1];
                    if (dp[i][j]) break;
                    l--;
                }
                // . 可以匹配任意字符
            } else if (pattern[i - 1] === "." || pattern[i - 1] === str[j - 1]) {
                dp[i][j] = dp[i - 1][j - 1];
            }
        }
    }
    console.log(dp)
    return dp[m][n];
}
module.exports = {
    match: match,
};

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务