【面试经典150 | 双指针】判断子序列

news2024/12/24 20:48:23

文章目录

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

写在前面

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

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

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

Tag

【双指针】【动态规划】【字符串】


题目来源

392. 判断子序列


题目解题

判断字符串 s 是不是字符串 t 的子序列,字符串的子序列指的是原字符串删除一些字符或者不删除字符但是不改变原来字符顺序而形成的新的字符串。


解题思路

方法一:双指针

我们使用两个指针 ij,初始化分别指向字符串 st 的初始位置。从前往后对 s[i]t[j] 进行匹配:

  • 如果 s[i] = t[j],则同时向右移动双指针;
  • 如果 s[i] != t[j],则只移动指向字符串字符的指针 j
  • 无论是否匹配,都需要移动 j 指针;
  • 最终,如果 i 移动到了字符串 s 的末尾,说明 st 的子序列。

实现代码

class Solution {
public:
    bool isSubsequence(string s, string t) {
        int i = 0, j = 0;
        int n = s.size(), m = t.size();
        while(i < n && j < m) {
            if(s[i] == t[j])
                ++i;
            ++j;
        }
        return i == n;
    }
};

复杂度分析

时间复杂度: O ( n + m ) O(n+m) O(n+m) n n ns 的长度, m m mt 的长度。无论匹配是否成功,都至少youyige有一个指针向右移动,两指针的移动总距离为 n + m n+m n+m

空间复杂度: O ( 1 ) O(1) O(1),仅仅使用了两个指针变量。

方法二:动态规划

方法一有可以进行优化的地方,在方法一中,我们需要枚举匹配 t 中的字符,如果 t 中不匹配的字符很长,我们会有大量的时间浪费在 t 中找下一个匹配的字符。

于是,我们可以先对字符串 t 进行预处理,记录从每个位置开始往后每一个字符第一次出现的位置。

状态

f[i][j] 表示字符串 t 中从位置 i 开始往后字符 j 第一次出现的位置。

状态转移

有如下的状态转移关系:

  • 如果 t[i] = j,那么 f[i][j] = i
  • 否则,f[i][j] = f[i+1][j]

根据以上转移关系,我们需要对字符串 t 从后往前进行动态规划。

base case

我们的边界状态为 f[m-1][...],我们置 f[m][...] = m,让 f[m-1][...] 正常转移,如果 f[i][j] = m,则表示从位置 i 开始往后不存在字符 j

我们通过 f 数组,可以快速定位到字符串 t 后面每一个第一次出现的字符(s 中的字符):

  • 如果 f[i][j] = m,则表示从字符串 t 位置 i 开始往后不存在 s 中的字符 j,则直接返回 false
  • 否则,更新 i,从新的位置开始定位 s 中的字符;
  • 如果一直没遇到 m,最后返回 true

方法二使用动态规划的方法对字符串 t 进行一次处理,可以大大提高匹配,也是 进阶 题目的一种解法。

实现代码

class Solution {
public:
    bool isSubsequence(string s, string t) {
        int n = s.size(), m = t.size();
        vector<vector<int>> f(m+1, vector<int>(26, 0));
        for (int i = 0; i < 26; ++i) {
            f[m][i] = m;
        }

        for (int i = m-1; i >= 0; --i) {
            for (int j = 0; j < 26; ++j) {
                if (t[i] == j + 'a') {
                    f[i][j] = i;
                }
                else 
                    f[i][j] = f[i+1][j];
            }
        }

        int start = 0;
        for (int i = 0; i < n; ++i) {
            if (f[start][s[i] - 'a'] == m)
                return false;
            start = f[start][s[i] - 'a'] + 1;
        }
        return true;
    }
};  

复杂度分析

时间复杂度: O ( m × ∣ ∑ ∣ + n ) O(m \times \left| \sum \right| + n) O(m×+n) n n n 为字符串 s 的长度,m 为字符串 t 的长度, ∣ ∑ ∣ \left| \sum \right| 为字符集, ∣ ∑ ∣ = 26 \left| \sum \right| = 26 =26

空间复杂度: O ( m × ∣ ∑ ∣ ) O( m \times \left| \sum \right|) O(m×),使用的额外空间为对字符串 t 预处理所占用的空间。


写在最后

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

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

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

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

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

相关文章

如何在Gazebo中实现多机器人编队仿真

文章目录 前言一、仿真前的配置二、实现步骤1.检查PC和台式机是否通讯成功2.编队中对单个机器人进行独立的控制3、对机器人进行编队控制 前言 实现在gazebo仿真环境中添加多个机器人后&#xff0c;接下来进行编队控制&#xff0c;对具体的实现过程进行记录。 一、仿真前的配置…

keithley2400数字源表(吉时利)2400

181/2461/8938描述 2400型源表是一个20W的仪器&#xff0c;可以提供和测量从1 V到200V DC的电压和从10pA到1A的电流。它非常适合测试各种器件&#xff0c;包括二极管、电阻、电阻网络、有源电路保护器件以及便携式电池供电器件和元件。它对于系统电源和IDDQ测试应用也很有用 …

一、K近邻算法K-NN(有监督学习)

一、算法思路 K近邻算法&#xff0c;k-nearest neighbor&#xff0c;即K-NN 通俗来说&#xff1a;给定一个元素&#xff0c;然后以该元素坐标为圆心开始画圆&#xff0c;其中K值是超参数需要人为给定&#xff0c;圆的半径逐渐增大(距离度量采用欧氏距离)&#xff0c;直到包含其…

哪些企业需要数字化转型?

数字化转型是一个广泛且持续的过程&#xff0c;可以使各行业的公司受益。虽然数字化转型的具体需求和目标可能因企业而异&#xff0c;但这通常是保持竞争力和相关性的必要条件。以下是一些可能需要数字化转型的公司和行业的一些示例&#xff1a; 1.传统零售商&#xff1a;零售…

炫云云渲染3ds max效果图渲染教程

很多人在第一次使用炫云云渲染渲染效果图的时候不知道怎么使用&#xff0c;其实现在使用炫云渲染效果图真的很简单&#xff0c;我们一起来看看。 一客户端安装 1、打开炫云云渲染官网&#xff0c;点击右上角的客户端下载&#xff0c;选择炫云客户端&#xff08;NEXT版&#xf…

[linux]服务器挂代理提升下载权重速度

写在前面 这里主要以huggingface下载权重为例&#xff0c;介绍如何在linux中部署代理提升下载速度 实际操作 第一步&#xff1a;服务器安装clash文件 https://github.com/Dreamacro/clash/releases#下载clash链接第二步&#xff1a;使用自己的配置文件 将config.yaml替换掉…

DSOX3012A是德科技keysight DSOX3012A示波器

181/2461/8938是德科技DSOX3012A(安捷伦)示波器 是德科技DSOX3012A(安捷伦)是InfiniiVision 3000 X系列中的双通道型号。这款可升级示波器采用突破性技术设计&#xff0c;提供卓越的性能和功能。其独特的5仪器合一设计为相同的预算提供了更大的范围。 是德科技DSOX3012A示波器…

Vue系列(一)之 Vue入门

一. Vue简介 1.1 概述 Vue是一个构建用户界面(UI)的[渐进式]JavaScript框架。 2.2 特点 1.声明式编码&#xff0c;遵循MVVM原则 2.编码简单&#xff0c;体积小 3.组件化&#xff0c;复用率高&#xff0c;代码维护容易 2.3 MVVM介绍 MVVM&#xff0c;一种更好的UI模式解决…

Linux 或者 Docker 容器通过 date 设置系统时间

目录 1. Linux2. Docker 容器2.1 进入容器内部修改2.2 可能会遇到的问题 1. Linux 要在Linux系统中设置日期和时间&#xff0c;可以使用date命令。 使用以下命令格式来设置日期和时间&#xff1a; sudo date -s "YYYY-MM-DD HH:MM:SS"其中&#xff0c;YYYY表示年份…

Postman应用——Collection、Folder和Request

文章目录 Collection新建CollectionCollection重命名保存Request到Collection在Collection下创建Request删除Collection Folder新建FolderFolder重命名保存Request到Folder在Folder下创建Request在Folder下创建Folder删除Folder Request创建临时RequestRequest重命名删除Reques…

东芝电视Z750的音画效果好吗?调校的够真实吗?

精准匹配声音与画面,呈现“音画合一”的影院级视听盛宴,东芝电视Z750真的很不错,东芝电视拥有70余年的原色调校技术,色彩看起来细腻且舒服,饱和度和景深等都处理的很恰当,而且还有火箭炮音响系统,也是经过日本专业调校的,针对不同家居场景,都有不同的声音处理方案,让我们听到的…

基因组大小查询(二)|基因组组装结果查询

基因组大小&#xff08;size of genome&#xff09;是指单倍体细胞核中的所含的DNA的总量。在进行基因组测序之前&#xff0c;生物学家是用质量来衡量不同生物之间基因组的大小。对于已经测序发表的基因组&#xff0c;可以直接通过查询相关数据库中提交的基因组信息&#xff0c…

最新USB3.2接口,速度每秒传输2GB

你还用U盘吗&#xff1f;根据最新的USB结构规范来看&#xff0c;你的U盘或许该换新了。USB Promoter Group近日宣布USB 3.2规格将让现有的USB Type-C数据线传输速度提升一倍&#xff1a;作为USB3.1的升级版&#xff0c;它最主要的改变就是将理论传输速率从1GB/s提升到2GB/s。 根…

气传导耳机对耳朵有伤害吗?气传导耳机哪款好?

​随着气传导耳机的快速发展&#xff0c;在运动、办公等场合能够经常看到&#xff0c;带来了前所未有的舒适体验。作为一种新型耳机类型&#xff0c;相较传统入耳式耳机来说&#xff0c;更有利于耳道卫生&#xff0c;在听歌时还能保持对环境声的感知。面对市面上这么多气传导耳…

html排版标签

1.标题标签h1-h6align 2.水平线<hr> 和换行<br/>3.html实体标签 半角空格&emsp; 全角空格< >> <其他的html实体 4.div和span标签5.段落标签<p> html常用标签分类&#xff1a;排版标签、图片标签、超链接标签、表格标签、列表标签、表单标签 …

坐标休斯顿,TDengine 受邀参与第九届石油天然气数字化大会

美国中部时间 9 月 14 日至 15 日&#xff0c;第九届石油天然气数字化大会在美国德克萨斯州-休斯顿-希尔顿美洲酒店举办。本次大会汇聚了数百名全球石油天然气技术高管及众多极具创新性的数据技术方案商&#xff0c;组织了上百场硬核演讲&#xff0c;技术专家与行业从业者共聚一…

【PyTorch 攻略 (4/7)】张量和梯度函数

一、说明 W在训练神经网络时&#xff0c;最常用的算法是反向传播。在该算法中&#xff0c;参数&#xff08;模型权重&#xff09;根据损失函数相对于给定参数的梯度进行调整。损失函数计算神经网络产生的预期输出和实际输出之间的差异。 目标是获得尽可能接近零的损失函…

一款 Linux 邮件客户端—Nylas Mail

导读Linux 上面有许多邮件客户端&#xff0c;Geary、Empathy、Evolution 和 Thunderbird 本身已经为很多用户提供了很好的服务&#xff0c;但是我发现了值得一试的软件&#xff1a; Nylas Mail。 为什么使用 Nylas&#xff1f; ​很多人因为种种原因选择了 Nylas Mail。让我们…

雷池社区WAF:保护您的网站免受黑客攻击 | 开源日报 0918

keras-team/keras Stars: 59.2k License: Apache-2.0 Keras 是一个用 Python 编写的深度学习 API&#xff0c;运行在机器学习平台 TensorFlow 之上。它 简单易用&#xff1a;减少了开发者认知负荷&#xff0c;使其能够更关注问题中真正重要的部分。灵活性强&#xff1a;通过逐…

Learn Prompt-ChatGPT 精选案例:代码助理

你可以使用 ChatGPT 进行代码生成、生成测试用例、注释、审查和漏洞检测。 代码生成​ 我们可以让 ChatGPT 自动生成一个排序算法中的快速排序的Python代码。 简单的代码生成对于 ChatGPT 来说小事一桩。 测试用例​ 用例来源出自StuGRua 在待测函数函数定义清晰的情况下…