【面试经典150 | 动态规划】交错字符串

news2024/11/20 13:22:16

文章目录

  • 写在前面
  • Tag
  • 题目来源
  • 解题思路
    • 方法一:动态规划
  • 写在最后

写在前面

本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……

专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:

  • Tag:介绍本题牵涉到的知识点、数据结构;
  • 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
  • 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
  • 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
  • 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。

Tag

【动态规划】【字符串】


题目来源

97. 交错字符串


解题思路

方法一:动态规划

首先进行特判,记字符串 s1 的长度、字符串 s2 的长度、字符串 s3 的长度分别为 mnt。如果 m + n != t,那么 s3 一定无法由 s1s2 交错组成。

定义状态

m + n = t 时,定义 f[i][j] 表示 s1 的前 i 个字符和 s2 的前 j 字符是否能交错组成 s3 的前 i+j 个字符。

转移关系

如果 s1 的第 i 个字符和 s3 的第 i+j 个字符相同,那么 s1 的前 i 个字符和 s2 的前 j 字符是否能交错组成 s3 的前 i+j 个字符 取决于 s1 的前 i-1 个字符和 s2 的前 j 字符是否能交错组成 s3 的前 i+j-1 个字符,即有:

KaTeX parse error: Expected 'EOF', got '&' at position 22: …j] = f[i-1][j] &̲ (s_1[i-1] == s…

同理,如果 s2 的第 j 个字符和 s3 的第 i+j 个字符相同,那么 s1 的前 i 个字符和 s2 的前 j 字符是否能交错组成 s3 的前 i+j 个字符 取决于 s1 的前 i 个字符和 s2 的前 j-1 字符是否能交错组成 s3 的前 i+j-1 个字符,即有:

KaTeX parse error: Expected 'EOF', got '&' at position 22: …j] = f[i][j-1] &̲ (s_2[j-1] == s…

base case

边界条件为 f[0][0] = true

最后返回

最终返回 f[m][n],表示字符串 s3 是否可以右字符串 s1s2 交错形成。

朴素实现代码

class Solution {
public:
    bool isInterleave(string s1, string s2, string s3) {
        int m = s1.size(), n = s2.size(), t = s3.size();
        if (m + n != t) return false;

        vector<vector<int>> f(m+1, vector<int>(n+1, false));

        f[0][0] = true; // base case 空字符串可以交错形成空字符串
        for (int i = 0; i <= m; ++i) {
            for (int j = 0; j <= n; ++j) {
                int p = i + j - 1;
                if (i > 0) {
                    f[i][j] |= f[i-1][j] && (s1[i-1] == s3[p]);
                }
                if (j > 0) {
                    f[i][j] |= f[i][j-1] && (s2[j-1] == s3[p]);
                }
            }
        }
        return f[m][n];
    }
};

使用滚动数组优化空间复杂度。 因为这里数组 f 的第 i 行只和第 i−1 行相关,所以我们可以用滚动数组优化这个动态规划,这样空间复杂度可以变成 O ( m ) O(m) O(m)

空间优化代码

class Solution {
public:
    bool isInterleave(string s1, string s2, string s3) {
        int m = s1.size(), n = s2.size(), t = s3.size();
        if (m + n != t) return false;

        vector<int> f(n+1, false);

        f[0] = true; // base case 空字符串可以交错形成空字符串
        for (int i = 0; i <= m; ++i) {
            for (int j = 0; j <= n; ++j) {
                int p = i + j - 1;
                if (i > 0) {
                    f[j] &= (s1[i-1] == s3[p]);
                }
                if (j > 0) {
                    f[j] |= f[j-1] && (s2[j-1] == s3[p]);
                }
            }
        }
        return f[n];
    }
};

复杂度分析

时间复杂度: O ( m n ) O(mn) O(mn) m m m 为字符串 s1 的长度, n n n 为字符串 s2 的长度。

空间复杂度:按行进行滚动数组优化后的空间复杂度为 O ( m ) O(m) O(m),朴素动态规划的时间复杂度为 O ( m n ) O(mn) O(mn)


写在最后

如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。

最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。

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

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

相关文章

JAVA毕业设计133—基于Java+Springboot+Vue的网上宠物店商城管理系统(源代码+数据库+12000字论文)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootVue的网上宠物店商城管理系统(源代码数据库12000字论文)133 一、系统介绍 本项目前后端分离&#xff0c;分为管理员、用户两种角色 1、用户&#xff1a; 注册…

聚合DNS管理系统v1.0全新发布 域名解析管理系统

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 聚合DNS管理系统可以实现在一个网站内管理多个平台的域名解析&#xff0c;目前已支持的域名平台有&#xff1a;阿里云、腾讯云、华为云、西部数码、CloudFlare。本系统支持多用户&…

数据挖掘中的PCA和KMeans:Airbnb房源案例研究

目录 一、PCA简介 二、数据集概览 三、数据预处理步骤 四、PCA申请 五、KMeans 聚类 六、PCA成分分析 七、逆变换 八、质心分析 九、结论 十、深入探究 10.1 第 1 步&#xff1a;确定 PCA 组件的最佳数量 10.2 第 2 步&#xff1a;使用 9 个组件重做 PCA 10.3 解释 PCA 加载和特…

高度不同的流体瀑布css实现方法

商城商品列表 实现瀑布流展示&#xff0c;通过flex或grid实现会导致每行中的列高度一致&#xff0c;无法达到错落有致的感觉&#xff1b; 为此需要用到&#xff1a; CSS columns 属性 columns 属性是一个简写属性&#xff0c;用于设置列宽和列数。 CSS 语法 columns: column-wi…

网络攻防中json序列化漏洞案例,fastjson远程命令执行漏洞原理

网络攻防中json序列化漏洞案例,fastjson远程命令执行漏洞原理。 网络攻防中的JSON序列化漏洞是指当应用程序使用JSON(JavaScript Object Notation)格式来序列化和反序列化对象时,由于不当处理或不安全的编程实践,导致攻击者能够执行恶意操作的安全漏洞。这些操作可能包括远…

成为不可替代的人,优秀到不能被忽视

一、资料描述 本套个人成长资料&#xff0c;大小30.89M&#xff0c;共有21个文件。 二、资料目录 00发刊词 成为不可替代的人.pdf 01累死你的不是工作&#xff0c;是错的职场价值观.pdf 02教你选好行业&#xff0c;远离裁员降薪.pdf 03如何选对公司&#xff0c;让高薪升值…

AJAX —— 学习(一)

目录 一、原生 AJAX &#xff08;一&#xff09;AJAX 介绍 1.理解 2.作用 3.最大的优势 4.应用例子 &#xff08;二&#xff09;XML 介绍 1.理解 2.作用 &#xff08;三&#xff09;AJAX 的特点 1.优点 2.缺点 二、HTTP 协议 &#xff08;一&#xff09;HTTP 介…

【攻防世界】ics-05

php://filter 伪协议查看源码 preg_replace 函数漏洞 1.获取网页源代码。多点点界面&#xff0c;发现点云平台设备维护中心时&#xff0c;页面发生变化。 /?pageindex 输入什么显示什么&#xff0c;有回显。 用php://filter读取网页源代码 ?pagephp://filter/readconvert.…

docker安装、调试qsign签名服务器

go-cqhttp 在 Docker 里早就部署好了&#xff0c;由于没有搭建 qsign 签名服务器&#xff0c;所以迟迟不敢上线。今天终于搞定了在 Docker 下安装 qsign 签名服务器了。这次用的docker市场里找到的镜像&#xff0c;下次找时间制作一个自己的镜像。 1 拉取和运行镜像&#xff1a…

轻薄本没有独立显卡如何运行stable diffusion

众所周知&#xff0c;Stable Diffusion WebUI 使用 GPU 模式运行。 一&#xff1a;检查自己显卡 打开任务管理器或者winR 输入dxdiag 查看自己显卡状态 很明显一般轻薄本只会带有集显&#xff0c;不能满足stable diffusion要求所以我们可以使用cup来运行stable diffusion 在…

转让1000万不良资产处置公司包变更需要多久

随着经济的发展和市场的变化&#xff0c;越来越多的公司需要进行资产的处置和转让&#xff0c;以提言公司的效益和盈利。山东不良资产处置公司作为一家专门服务于资产处置和转让的企业&#xff0c;其流程与变更步骤对于资产转让的操作至关重要。可以致电咨询我或者来公司面谈。…

电荷泵如何实现升压原来

电荷泵如何实现升压原来 某芯片自举栅极驱动内部原理图迪克森电荷泵 某芯片自举栅极驱动内部原理图 迪克森电荷泵 迪克森电荷泵&#xff08;Dickson Charge Pump&#xff09;是一种电压倍增器电路&#xff0c;可以将低电压升高到较高电压&#xff0c;相对于其他电压升压电路&a…

网站建设 之 发布ios

首先将forceDev改为false 然后执行npm run build:ios 然后用xocode安装到手机上进行测试 ##Version&#xff08;应用程序发布版本号&#xff09; 对应的就是CFBundleShortVersionString。该版本的版本号是三个时期分隔的整数组成的字符串&#xff1a; 第一个整数代表重大修…

Pytoch安装记录

使用pycharm 1、CUDA的安装 官网&#xff1a;CUDA Toolkit Archive | NVIDIA Developer 选择对应的版本 选择对应的版本进行下载&#xff1a; 有3个多G cuda的安装需要注意&#xff0c;如果没有安装vs&#xff0c;则需要选择自定义安装&#xff0c;在自定义的安装中取消 安…

101. 对称二叉树及同类题

101. 对称二叉树 力扣题目链接(opens new window) 给定一个二叉树&#xff0c;检查它是否是镜像对称的。 递归 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNo…

SSM框架学习——Eclipse创建Spring MVC maven项目

Spring MVC项目创建 什么是Spring MVC Spring MVC是Spring内置的&#xff0c;实现了Web MVC设计模式的框架。 它解决了Web开发过程中很多的问题&#xff0c;例如参数接收、表单验证等。另外它采用松散耦合可插拔组件等结构&#xff0c;具有相对较高的灵活性和扩展性。 Spri…

企业案例:金蝶云星空集成钉钉,帆软BI

正文&#xff1a;在数字化转型的大潮中&#xff0c;众多企业开始探索并实践高效的数据流转与集成&#xff0c;以提升内部管理效率和决策质量。本文将以某企业为例&#xff0c;详细介绍如何通过将钉钉审批流程的数据实时同步至金蝶云星空&#xff0c;并进一步在帆软报表平台上实…

控制台RPG 游戏实现双缓冲无屏闪,玩家类,地图类

重整控制台RPG——双缓冲无屏闪以及第一个无中生有的地图类&#xff0c;玩家类_哔哩哔哩_bilibili 是鄙人解说鄙人的代码 #include <iostream> #include <string.h> #include <windows.h>#define KEY_DOWN(vKey) ((GetAsyncKeyState(vKey) & 0x8000) ?…

Prometheus+grafana环境搭建MongoDB(docker+二进制两种方式安装)(五)

由于所有组件写一篇幅过长&#xff0c;所以每个组件分一篇方便查看&#xff0c;前四篇mongodb的exporter坑也挺多总结一下各种安装方式&#xff0c;方便后续考古。 Prometheusgrafana环境搭建方法及流程两种方式(docker和源码包)(一)-CSDN博客 Prometheusgrafana环境搭建rabb…

先进电气技术 —— (控制理论)何为稳定性?

一、系统稳定性 在控制理论中&#xff0c;系统稳定性是一个非常关键的概念&#xff0c;它主要涉及系统对外界扰动或内部变动的响应行为。以下是与系统稳定性相关的一些核心名词及其解释&#xff1a; 基本概念 稳定性&#xff08;Stability&#xff09; 系统稳定性是指当系统受…