leetcode10---动态规划

news2024/11/18 17:26:21

题目地址leetcode10

本题的解题思路

题目中的匹配是一个逐步匹配的过程,我们每次从字符串p中取一个字符出来,有两种可能,一种是取出来字母字符或者‘.’,另外一种是取出来[字符+‘*’]组合,他可以在s中匹配任意自然数个字符,并不具备唯一性,因此我们可以考虑使用动态规划,对匹配的方案进行枚举。

  • 如果 p p p 的第 j j j 个字母是小写字母,那么我们必须在 s s s 中匹配一个相同的小写字母

我们用 f [ i ] [ j ] f[i][j] f[i][j] 表示 s s s 的前 i i i 个字符与 p p p 中的前 j j j 个字符是否可以匹配,那么就有状态转移方程

在这里插入图片描述

  • 如果 p p p 的第 j j j 个字母是 ∗ * ,那么我们可以匹配多次

匹配零次的话有(也就是我们没有匹配任何字符)
f [ i ] [ j ] = f [ i ] [ j − 2 ] f[i][j] = f[i][j-2] f[i][j]=f[i][j2]
匹配一次
f [ i ] [ j ] = f [ i − 1 ] [ j − 2 ] , i f    s [ i ] = p [ j − 1 ] f[i][j] = f[i-1][j-2],if \; s[i]=p[j-1] f[i][j]=f[i1][j2],ifs[i]=p[j1]
匹配两次
f [ i ] [ j ] = f [ i − 2 ] [ j − 2 ] , i f    s [ i − 1 ] = s [ i ] = p [ j − 1 ] f[i][j] = f[i-2][j-2],if \; s[i-1]=s[i]=p[j-1] f[i][j]=f[i2][j2],ifs[i1]=s[i]=p[j1]
匹配三次
f [ i ] [ j ] = f [ i − 3 ] [ j − 2 ] , i f    s [ i − 2 ] = s [ i − 1 ] = s [ i ] = p [ j − 1 ] f[i][j] = f[i-3][j-2],if \; s[i-2]=s[i-1]=s[i]=p[j-1] f[i][j]=f[i3][j2],ifs[i2]=s[i1]=s[i]=p[j1]
这里我个人理解起来是有点困难的,为什么匹配一次的话,状态转移就是 i i i向前移一位呢,不应该是向后匹配嘛,其实这里是因为我的思维和深度优先搜索有点混淆了,这里我们只考虑状态转移,只考虑马尔科夫决策过程,这样想的话就是想的通了。

但是这样依旧麻烦,因为我需要枚举到底要匹配多少字符,导致时间复杂度升高,其实本质上只有两种情况

(1) 匹配 s s s 末尾的一个字符,将该字符扔掉,而该组合还可以继续进行匹配;

(2) 不匹配字符,将该组合扔掉,不再进行匹配。

所以写出状态转移方程

在这里插入图片描述

这里是很巧妙的,如果s的前 i − 1 i-1 i1位字符和p的前 j j j位字符可以匹配的话,那么这一位可以匹配就可以

如果s的前 i i i位字符和p的前 j − 2 j-2 j2位字符可以匹配的话,那么这一位也可以匹配

  • 在任意情况下,只要 p [ j ] p[j] p[j]是‘.’,那么 p [ j ] p[j] p[j]是一定成功匹配 s s s中的任意一个小写字母,最终状态转移方程为

在这里插入图片描述

其中matches(x,y) 判断两个字符是否匹配的辅助函数。只有当y是’.',或者x和y本身相同时,这两个字符才会匹配。

动态规划的边界条件为 f [ 0 ] [ 0 ] = t r u e f[0][0]=true f[0][0]=true,即两个空字符串是可以匹配的。最终的答案即为 f [ m ] [ n ] f[m][n] f[m][n],其中 m m m n n n分别是字符串s和p的长度。由于大部分语言中,字符串的字符下标是从0开始的,因此在实现上面的状态转移方程时,需要注意每一维下标与实际字符下标的对应关系。

在上面的状态转移方程中,如果字符串p中包含一个「字符 + 星号」的组合,那么在进行状态转移时,会先将a进行匹配,再将a*作为整体进行匹配,这样做看起来像是将a多进行了一次状态转移,实际上是这样吗?答案是:不是。为什么呢,因为无论a匹配的对或错,这一次的状态转移结果在后面的运算中都没有用到。

整体代码

class Solution {
public:
    bool isMatch(string s, string p) {
        int m = s.size();
        int n = p.size();
        
        // 这里的matches函数像是lambda表达式,他是一个函数,执行下面的程序
        // ()小括号中是形参列表;{}括号中是函数体,因为是定义函数,大括号后面记得加 ; 分号。
        auto matches = [&](int i, int j) {
            if (i == 0) {
                return false;
            }
            if (p[j - 1] == '.') {
                return true;
            }
            return s[i - 1] == p[j - 1];
        };

        vector<vector<int>> f(m + 1, vector<int>(n + 1));
        f[0][0] = true;
        for (int i = 0; i <= m; ++i) {
            for (int j = 1; j <= n; ++j) {
                if (p[j - 1] == '*') {
                    f[i][j] |= f[i][j - 2];
                    if (matches(i, j - 1)) {
                        f[i][j] |= f[i - 1][j];
                    }
                }
                else {
                    if (matches(i, j)) {
                        f[i][j] |= f[i - 1][j - 1];
                    }
                }
            }
        }
        return f[m][n];
    }
};

总结:动态规划的精髓状态转移,这个题也是这样的,下一个状态只与上一个状态有关

ps:数学公式的支持有点差

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

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

相关文章

Vulnhub靶机:LAMPSECURITY_ CTF5

目录介绍信息收集主机发现主机信息探测网站探测敏感信息泄露挂马提权敏感信息收集提权成功介绍 系列&#xff1a;LAMPSecurity&#xff08;此系列共5台&#xff09; 发布日期&#xff1a;2009年5月10日 难度&#xff1a;初 运行环境&#xff1a;VMware Workstation 目标&#…

Canvas学习记录

Canvas学习基本用法1.首先得有canvas元素2.获取渲染上下文3.检查浏览器支持性4.例子绘制图形1.矩形2. 绘制路径3. 移动笔触4. 绘制直线5. 圆弧二次贝塞尔曲线与三次贝塞尔曲线Path2D 对象创建Path2D对象Path2D.addPath()使用样式和颜色色彩Colors透明度 Transparency线型 Line …

oracle DML与DDL

一、数据库语言介绍 DML&#xff08;数据库操作语言&#xff09;&#xff1a;其中包括 insert/delete/update/select等操作。 DDL&#xff08;数据库定义语言&#xff09;&#xff1a;其中包括create/alter/drop等操作。 区别&#xff1a;1、DDL是针对数据库对象(例如&#…

【安全学习】apache通告中的漏洞描述

分析 漏洞描述 我们可以看看在apache通告中对漏洞的简单的描述 很明显&#xff0c;从这个漏洞描述中&#xff0c;我们能够明白这个CVE的造成主要是因为dubbo中内置的hessian项目&#xff0c;主要是因为在中的及以前版本中存在有这个漏洞hessian-lite3.2.12 来看看是因为哪里…

3. 请求

1. 请求映射路径 RequestMapping注解 名称&#xff1a;RequestMapping类型&#xff1a;方法注解 类注解位置&#xff1a;SpringMVC控制器方法定义上方作用&#xff1a;设置当前控制器方法请求访问路径&#xff0c;如果设置在类上统一设置当前控制器方法请求访问路径前缀范例 …

Matter理论介绍-通用-1-03:桥接器-数据结构

【源码、文档、软件、硬件、技术交流、技术支持&#xff0c;入口见文末】 【所有相关IDE、SDK和例程源码均可从群文件免费获取&#xff0c;免安装&#xff0c;解压即用】 持续更新中&#xff0c;欢迎关注&#xff01; 一、简介 Bridge&#xff08;桥接器&#xff09;存在的意…

springboot集成webstock实战:服务端数据推送数据到客户端实现实时刷新

背景 之前介绍过springboot集成webstock方式,具体参考: springboot集成websocket实战:站内消息实时推送 这里补充另外一个使用webstock的场景,方便其他同学理解和使用,废话不多说了,直接开始!简单介绍一下业务场景: 现在有一个投票活动,活动详情中会显示投票活动的参与人数…

【代码随想录】二刷-贪心算法

贪心算法 《代码随想录》 什么是贪心&#xff1f; 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 贪心没有规定的套路。 刷题或面试的时候&#xff0c;手动模拟一下感觉可以局部最优退出整体最优&#xff0c;而且想不到反例&#xff0c;那么就试一试贪心。…

Python游戏开发之Dungeon Crawler 游戏源码大全

源码一 功能: WASD 移动 SPACE 攻击 SHIFT 使用楼梯 介绍 每个级别都包含一把钥匙和一个上锁的舱口。收集钥匙以解锁通往下一层的通道(SHIFT解锁)。 史莱姆造成的伤害最小,但每一层都会产生更多。他们可以降低健康或 XP。更多 XP = 每次攻击造成更多伤害。硬币目前没有…

OpenCV 读取、显示和保存图像

目录 一、OpenCV 读取图像 OpenCV 读取函数 参数&#xff1a; 二、OpenCV 显示图像 imshow函数 imshow函数功能 imshow函数原型 三、OpenCV 保存图像 四、结果和代码 一、OpenCV 读取图像 OpenCV 允许我们对图像执行多种操作&#xff0c;但要做到这一点&#xff0c;需…

云原生之使用Docker部署Python应用

云原生之使用Docker部署Python应用一、检查系统版本1.检查系统 版本2.检查系统内核二、检查docker状态三、编辑python文件1.创建目录2.编辑test.py文件四、构建镜像1.编辑dockerfile文件2.使用dockerfile构建镜像五、运行镜像容器1.运行python_app容器2.查看容器状态六、访问Py…

java大学校园饭卡管理系统饭卡查询系统饭卡挂失网站源码

springboot开发的大学生饭卡系统&#xff0c;学生可以登录该系统充值饭卡&#xff0c;挂失饭卡&#xff0c;取消挂失&#xff0c;查看自己的所有饭卡&#xff0c;以及发卡的充值记录。超级管理员拥有最大的权限&#xff0c;饭卡管理员可以添加饭卡信息&#xff0c;充值&#xf…

如何将敏捷开发与V模型深度融合?这家企业给出答案

随着汽车智能化的快速发展&#xff0c;消费者对智能汽车的需求正在发生变化&#xff0c;车企开始思考如何能快速满足消费者的这些需求。这也对汽车供应商提出更大挑战&#xff0c;Tier 1不仅应该具备提供相应高质量产品的量产能力&#xff0c;更要快速满足主机厂和用户对汽车智…

【MySQL基础教程】图形化界面工具介绍、安装与使用

前言 本文为 【MySQL基础教程】图形化界面工具介绍、安装与使用 相关介绍&#xff0c;下边将对图形化界面工具介绍&#xff0c;DataGrip的安装与DataGrip的使用进行详尽介绍~ &#x1f4cc;博主主页&#xff1a;小新要变强 的主页 &#x1f449;Java全栈学习路线可参考&#x…

八、Express框架 安装

对于Express框架的就不进行过多介绍&#xff0c;Express官方对该框架的定位是&#xff1a;"基于Node.js平台&#xff0c;快速、开放、极简的 Web 开发框架"&#xff0c;本篇开始记录关于 Node.js 轻量级Web开发框架 &#xff1a;Express框架&#xff0c;下面先进行Ex…

高可用架构和系统设计经验

导语 | 本文从研发规范层面、应用服务层面、存储层面、产品层面、运维部署层面、异常应急层面这六大层面去剖析一个高可用架构和系统需要有哪些关键的设计和考虑。 一、高可用系统架构设计思想 1-1、可用性和高可用概念 可用性是一个可以量化的指标&#xff0c;计算的公式在维…

刷爆力扣之亲密字符串

刷爆力扣之亲密字符串 HELLO&#xff0c;各位看官大大好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 今天阿呆继续记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照不同类别标签进行刷题&#xff0c;…

基于VUE学生选课管理系统

开发工具(eclipse/idea/vscode等)&#xff1a;idea 数据库(sqlite/mysql/sqlserver等)&#xff1a;mysql 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 一、登录注册模块: 1.学生&#xff0c;教师&#xff0c;管理员三个角色&#xff08;同一时刻&#xff0c;账户…

Incorporating Dynamic Semantics into Pre-Trained Language Model for ABSA 论文阅读笔记

一、作者 Kai Zhang、Kun Zhang、Mengdi Zhang、Hongke Zhao、Qi Liu、Wei Wu、Enhong Chen School of Data Science, University of Science and Technology of China School of Computer Science and Information Engineering, Hefei University of Technology Meituan …

移动端Swiper的一些尝试(中间完整,两边有内容,循环展示)

【背景】最近公司的需求很多实现一个Swiper滑块&#xff0c;中间完整。两边展示一些内容&#xff08;可能是固定的提示方案&#xff0c;也可能是前后上下一页的部分内容&#xff09;&#xff0c;然后还需要循环滚动&#xff0c;其中遇到了一些问题特此记录 1、实现两边展示内容…