首页 > 其他分享 >力扣困难级别-10. 正则表达式匹配

力扣困难级别-10. 正则表达式匹配

时间:2022-09-25 12:12:43浏览次数:56  
标签:10 匹配 正则表达式 preList list pos 力扣 length let

这道题昨天做了一下午,用动态规划、以及循环的方式也没弄出来,去评论去看了下,确实挺难的。

晚上想到可以用做隐马尔科夫模型的思路,每次根据上一次的状态生成下一次的状态,最后判断最长的链条

思路清晰了,代码也简单了,一下就通过了

 

给你一个字符串 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 <= 30
s 只包含从 a-z 的小写字母。
p 只包含从 a-z 的小写字母,以及字符 . 和 *。
保证每次出现字符 * 时,前面都匹配到有效的字符

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/regular-expression-matching
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

/**
 * @param {string} s
 * @param {string} p
 * @return {boolean}
 */
var isMatch = function(s, p) {
    //用隐马尔科夫链条的思路,每次根据上一次的状态生成下一次的状态,最后判断最长的链条
    let preList = [0];
    let list = [];
    for (let i = 0; i < p.length; i++) {
        if (p[i + 1] === '*') {
            preList.forEach(function(k) {
                let pos = k;
                list.push(pos);
                while (pos < s.length && (p[i] === '.' || p[i] === s[pos])) {
                    pos++;
                    list.push(pos)
                }

            });
            i++;
        } else {
            preList.forEach(function(pos) {
                if (pos < s.length && (p[i] === '.' || p[i] === s[pos])) {
                    list.push(pos + 1)
                }

            })

        }
        //更新链条,进入下一次循环
        preList = list;
        list = [];
    }
    //判断最长链条
    let isOk = false
    for (let i = 0; i < preList.length; i++) {
        if (preList[i] === s.length) {
            isOk = true
            break
        }
    }
    return isOk;
};

 

标签:10,匹配,正则表达式,preList,list,pos,力扣,length,let
From: https://www.cnblogs.com/caoke/p/16727594.html

相关文章

  • 学习记录10数组
    数组概述数组的定义数组是相同类型数据的有序集合数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成其中,每一个数据称作一个数组的元素,每个数组元素可......
  • 带有服务器端渲染 (SSR) React 前端的 Umbraco v10
    带有服务器端渲染(SSR)React前端的Umbracov10CreatedwithDALL-E(OpenAI)介绍最近我想尝试UmbracoCMS是否可以与React前端集成,同时保持对SEO友好。如果......
  • 10种常见的回归算法总结和介绍
    线性回归是机器学习中最简单的算法,它可以通过不同的方式进行训练。在本文中,我们将介绍以下回归算法:线性回归、Robust回归、Ridge回归、LASSO回归、ElasticNet、多项式......
  • 正则表达式速查手册
    一、校验数字的表达式数字:^[0-9]*$n位的数字:^\d{n}$至少n位的数字:^\d{n,}$m-n位的数字:^\d{m,n}$零和非零开头的数字:^(0|[1-9][0-9]*)$非零开头的最多带两位小数的数......
  • #100daysofcode
    #100daysofcodeR1D9Photoby瓦列里·西索耶夫on不飞溅学习做了一些触摸打字课。这有助于输入大量代码以下来源文档中只能有一个body元素<body></body>......
  • 力扣217(java&python)-存在重复元素(简单)
    题目:给你一个整数数组nums。如果任一值在数组中出现至少两次,返回true;如果数组中每个元素互不相同,返回false。 示例1:输入:nums=[1,2,3,1]输出:true示例2:输入......
  • 力扣算法之数组中出现次数超过一半的数字
    数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例:输入:[1,2,3,2,2,2,5,4,2]输......
  • 正则表达式——Robyn编程学习(Java)
    正则表达式为什么我们要学习正则自然语言处理是计算机程序的重要组成部分,而正则表达式则是处理文本的利器,通过设置合适的正则表达式,可以快速处理文本,从而提高工作的效率......
  • 20220924--CSP-S模拟10
    A.欧几里得的噩梦首先发现第一问所询问的异或值数量就是所求的第二问的最小集合的元素个数次方因为除去集合里的任一一个元素,其中若干个元素异或之后的集合就不可能为原......
  • CSP-S模拟10
    T1.欧几里得的噩梦第一眼,这不是线性基板子题吗。但是值域是\(2^{5e5}\),但是我们发现它的一个神奇性质,一个数的二进制中只有两个一。我们定义高位为x,低位为y。如果线性基中......