154 · 正则表达式匹配

news2024/11/14 20:18:50

链接:LintCode 炼码 - 更高效的学习体验!

题解:

class Solution {
public:
    /**
     * @param s: A string 
     * @param p: A string includes "." and "*"
     * @return: A boolean
     */
    bool isMatch(string &s, string &p) {
        // write your code here
        int m = s.size();
        int n = p.size();
        if (m <= 0 && n <= 0) {
            return true;
        }
        std::vector<std::vector<int>> dp(m+1, std::vector<int>(n+1, false));
        for (int i = 0; i <= m; ++i) {
            for (int j = 0; j <= n; ++j) {
                if (i == 0 && j == 0) {
                    dp[i][j] = true;
                } else if (j == 0) {

                } else if (i > 0 && p[j-1] == '.') {
                    // 当前.匹配上字符
                    dp[i][j] |= dp[i-1][j-1];
                } else if (p[j-1] == '*') {
                    // *表示匹配0前面字符情况,s[i-1] 和p[j-3]前面匹配决定
                    dp[i][j] |= dp[i][j-2];
                    // 把s[i-1] 和 p[j-2] 判断是否匹配,当作一个整体
                    if (i > 0 && j > 1 && (p[j-2] == s[i-1] || p[j-2] == '.')) {
                        dp[i][j] |= dp[i-1][j];
                    }
                } else if (s[i-1] == p[j-1]) {
                    // 如果字符相等
                    dp[i][j] |= dp[i-1][j-1];
                }
            }
        }
        return dp[m][n];
    }
};

class Solution {
public:
    /**
     * @param s: A string 
     * @param p: A string includes "." and "*"
     * @return: A boolean
     */
    std::vector<std::vector<int>> _dp;
    bool isMatch(string &s, string &p) {
        // write your code here
        int m = s.size();
        int n = p.size();
        if (m <= 0 && n <= 0) {
            return true;
        }
        if (n <= 0) {
            return false;
        }
        _dp.resize(m, std::vector<int>(n, -1));
        return dfs(s, p, 0, 0);
    }
private:
    bool dfs(string &s, string &p, int s1, int p1) {
        if (s1 >= s.size()) {
            if (p1 >= p.size()) {
                return true;
            }
            if (p[p1] == '*' && p1 + 1 >= p.size()) {
                return true;
            }
            if (p1 + 1 < p.size() && p[p1+1] == '*') {
                if (dfs(s, p, s1, p1+2)) {
                    return true;
                }
            }
            return false;
        }
        if (_dp[s1][p1] != -1) {
            return _dp[s1][p1] == 1 ? true : false;
        }
        if (s[s1] == p[p1]) {
            if(dfs(s, p, s1+1, p1+1)) {
                _dp[s1][p1] = 1;
                return true;
            }
            if (p1 + 1 < p.size() && p[p1+1] == '*') {
                return dfs(s, p, s1+1, p1+2) || dfs(s, p, s1, p1+2);
            }
        } else if (p[p1] == '.') {
            if(dfs(s, p, s1+1, p1+1)) {
                return true;
            }
            if (p1 + 1 < p.size() && p[p1+1] == '*') {
                cout << "test" << endl;
                _dp[s1][p1] = (dfs(s, p, s1+1, p1) || dfs(s, p, s1+1, p1+2) || dfs(s, p, s1, p1+2)) == true ? 1 : 0;
                return _dp[s1][p1] == 1 ? true : false;
            }
        } else if (p[p1] == '*') {
            if (dfs(s, p, s1, p1+1)) {
                return true;
            }
            if (p1 > 0 && (s[s1] == p[p1-1] || p[p1-1] == '.')) {
                cout << "haha" << endl;
                if (dfs(s, p, s1+1, p1)) {
                    return true;
                }
                if (dfs(s, p, s1+1, p1+1)) {
                    return true;
                }
            }
        } else if (p1 + 1 < p.size() && p[p1+1] == '*') {
            //cout << "okok" << endl;
            _dp[s1][p1] = dfs(s, p, s1, p1+2) == true ? 1 : 0;
            return _dp[s1][p1] == 1 ? true : false;
        }
        _dp[s1][p1] = 0;
        return false;
    }
};
class Solution {
    public boolean isMatch(String s, String p) {
        return search(0, 0,s,p, new Boolean[s.length() + 1][p.length() + 1]);
    }
    private boolean search(int i, int j, String s, String p, Boolean[][] memo){
        if(memo[i][j] != null){
            return memo[i][j];
        }
        boolean ans;
        if(j == p.length()){
            ans = i == s.length();
        }else{
            boolean firstMatch = (i < s.length() &&
                                  (s.charAt(i) == p.charAt(j) || p.charAt(j) == '.'));
            if(j + 1 < p.length() && p.charAt(j + 1) == '*'){
                ans = (search(i,j + 2, s, p, memo) || firstMatch &&
                       search(i + 1,j, s, p, memo));
            }else{
                ans = firstMatch && search(i + 1,j + 1, s, p, memo);
            }
        }
        memo[i][j] = ans;
        return ans;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2048175.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity求向量和平面的交点

已知条件&#xff1a;平面P的法向量&#xff0c;平面上的一点P0&#xff0c;直线L的方向向量&#xff0c;直线上的一点L0 公式推导&#xff1a; 主要是两点&#xff1a; 1.目标点T在直线上&#xff1a;TL0D*&#xff08;D未知&#xff09; 2.目标点T在平面上&#xff0c;则T…

Kubectl 常用命令汇总大全

kubectl 是 Kubernetes 自带的客户端&#xff0c;可以用它来直接操作 Kubernetes 集群。 从用户角度来说&#xff0c;kubectl 就是控制 Kubernetes 的驾驶舱&#xff0c;它允许你执行所有可能的 Kubernetes 操作&#xff1b;从技术角度来看&#xff0c;kubectl 就是 Kubernetes…

【JavaEE】一文学会如何使用:文件IO操作(详解)

目录 前言 什么是IO&#xff1f; IO流原理 IO流分类 InputStream字节流输入 文件输入流--FileInputStream 理解InputStream中的read方法 关闭文件操作 利用Scanner进行字符获取 OutputStream字节流输出 文件输出流--FileOutputStream 理解OutputStream中的…

计算机毕业设计选题推荐-在线学习平台-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

Linux - 权限

文章目录 一、用户二、文件 一、用户 1、Linux下有两种用户&#xff1a;超级用户&#xff08;root&#xff09;、普通用户。 超级用户&#xff1a;可以再linux系统下做任何事情&#xff0c;不受限制 。 普通用户&#xff1a;在linux下做有限的事情。 超级用户的命令提示符是“…

Python数据分析实战:从零开始构建销售预测模型

随着大数据时代的到来&#xff0c;数据分析已经成为企业决策的重要依据之一。Python作为一种强大的编程语言&#xff0c;在数据分析领域有着广泛的应用。本文将通过一个具体的案例——销售预测——来演示如何使用Python进行数据预处理、特征工程、模型构建与评估。无论你是Pyth…

【持续更新】Adoobe Afteer Effeects 2024 v24.5.0.052最新免费修改版

利用Adoobe Afteer Effeects CC&#xff0c;您可以轻松打造生动的动画标题、字幕以及下三分屏元素。无论是从零开始还是借助应用内丰富的预设动画&#xff0c;都能让您的文字以各种方式动起来&#xff0c;无论是旋转、滑动或是平移&#xff0c;创意无限。 将视频和图像融合在一…

负载均衡、高可用

负载均衡 负载均衡&#xff08;Load Balance&#xff09;&#xff1a;可以利用多个计算机和组合进行海量请求处理&#xff0c;从而获得很高的处理效率&#xff0c;也可以用多个计算机做备份&#xff08;高可用&#xff09;&#xff0c;使得任何一个机器坏了整个系统还是能正常…

华为HCIP证书好考吗?详解HCIP证书考试难易程度及备考策略!

华为认证体系主要分为三个层次&#xff1a;HCIA(Huawei Certified ICT Associate)&#xff0c;HCIP(Huawei Certified ICT Professional)和HCIE(Huawei Certified Internetwork Expert)。作为中级认证&#xff0c;HCIP证书主要面向具备一定技术基础和项目实践能力的专业人士。在…

SQL 数据库设计、事务、视图 <13>

一、数据库设计 1.多表之间的关系 1&#xff09; 一对一&#xff08;了解&#xff09; 如&#xff1a;人和身份证 分析&#xff1a;一个人只有一个身份证&#xff0c;一个身份证只能对应一个人 2&#xff09;一对多&#xff08;多对一&#xff09; 如&#xff1a;部门和员…

【C语言】深入讲解指针(上)

文章目录 前言字符指针指针数组数组指针数组指针的定义&数组名和数组名数组指针的使用 指针和数组传参一维数组传参二维数组传参一级指针传参二级指针传参 结束 前言 之前我们初步了解了指针的概念&#xff0c;没有看过的大家可以移步到【C语言】初阶指针详解&#xff0c;…

手撕C++入门基础

1.C介绍 C课程包括&#xff1a;C语法、STL、高阶数据结构 C参考文档&#xff1a;Reference - C Reference C 参考手册 - cppreference.com cppreference.com C兼容之前学习的C语言 2.C的第一个程序 打印hello world #define _CRT_SECURE_NO_WARNINGS 1 // test.cpp // …

day02--HTML CSS

一、HTML表单 表单的作用是用于采集用户再页面上填入的数据&#xff0c;并发送给后端服务器&#xff0c;经常用于用户注册、登录、xx信息添加、xx信息修改 1.1表单 1、input表示文本框 type属性&#xff1a;负责配置不同的输入框类型 text&#xff1a;普通文本框 password&…

服务器数据恢复—raid5阵列离线硬盘强制上线失败如何恢复数据?

服务器数据恢复环境&#xff1a; 某品牌2850服务器上有一组由6块SCSI硬盘组建的raid5磁盘阵列&#xff0c;上层操作系统为Redhat linuxext3文件系统。 服务器故障&初检&#xff1a; 服务器在运行过程中突然瘫痪&#xff0c;管理员对服务器中的raid进行检查后发现有两块硬盘…

P3572 [POI2014] PTA-Little Bird

[POI2014] PTA-Little Bird - 洛谷 核心思路 注意力惊人。 注意到&#xff0c;只有两种决策 选高过自己的树中代价最小的 或者 选低于自己的树种代价的最小的1。 取最小值 显然 不等式&#xff1a; 恒成立。 由此&#xff0c;维护一个优先队列即可。 AC 代码 #includ…

宠物空气净化器推荐买吗?清除浮毛的效果好吗

家里养了两只哈基米&#xff0c;它们每天的日常就是早上跑酷、中午跑酷、晚上还在跑酷&#xff0c;有时候看着很好玩&#xff0c;每天都活蹦乱跳的&#xff0c;这在说明它们很健康&#xff0c;我把它们养得很好&#xff0c;所以原谅它们经常跑跑跳跳得行为&#xff0c;虽然会把…

库室联管联控系统DW-S306|是一套智能化系统

装备库室联管联控系统&#xff08;DW-S306&#xff09;是依托互3D技术、RFID技术、数据库技术、AI、视频分析技术对库室装备进行统一管理、分析的信息化、智能化、规范化的系统。 本解决方案利用现有内部网络&#xff0c;部署部队装备库室联管联控系统&#xff0c;形成一套上下…

ai大模型之争-落地场景分析20240817

大模型之争&#xff1a; 目标&#xff1a;吸引客户的注意力&#xff0c;养成客户习惯&#xff0c;占领市场 结语 对于研发人员而言&#xff1a;浏览器插件&#xff0c;开发工具的大模型&#xff1a;通义灵码真是效率倍增的神器 对非研发普通人而言&#xff1a;增加很多便捷工…

DolphinScheduler集群部署问题(趟坑)总结

目录 官方文档 官方项目地址 问题解决 官方文档 DolphinScheduler | 文档中心 (apache.org) 官方项目地址 部署及使用过程中的问题可以参见项目Issue:Issues apache/dolphinscheduler GitHub GitHub - apache/dolphinscheduler at 3.2.2-release 问题解决 1、JVM在运…

ThreejsWebGPU运动残影demo

功能点 实例化SkinnedMesh 修改NodeMaterial着色器 节点材质系统 shader 语言 使用uniform和attribute 中合其他几篇博客中的内容 代码仓库 克隆后需要放到three源码同级别目录下 运行 three源码部分不在git仓库中(太大了) 使用vscode的live-server启动后访问 http://127.0.0.…