leetcode392--判断子序列

1. 题意

判断字符串 s s s是否为 t t t的子序列

2. 题解

2.1 双指针

对于在 t t t中找到的 s [ i ] s[i] s[i]字符,我们只需要找下一个即可。

即一个指针 i i i指向 s s s,一个指针 j j j指向 t t t;

  • s [ i ] = = t [ j ] , i ← i + 1 , j ← j + 1 s[i] ==t[j], i \leftarrow i+1,j \leftarrow j+1 s[i]==t[j],ii+1,jj+1
  • s [ i ] ≠ t [ j ] , i ← i + 1 s[i] \ne t[j], i \leftarrow i+1 s[i]=t[j],ii+1

代码

class Solution {
public:
    bool isSubsequence(string s, string t) {

        

        int slen = s.size();
        int tlen = t.size();
        if ( slen > tlen)
            return false;

        int i = 0;
        int j = 0;
        
        while ( i < slen && j < tlen ) {

            if (s[i] == t[j])
                ++i,++j;
            else {
                ++j;
            }
        }
        
        return i == slen; 
    }
};
2.2 双指针+预处理

我们可以预处理 j j j,当 s [ i ] ≠ t [ j ] s[i]\ne t[j] s[i]=t[j], j j j跳到下一个邻近 s [ i ] s[i] s[i]表示字符出现的位置。

预处理我们可以从后往前遍历;得到转移方程

d p [ i ] [ j ] = { d p [ i + 1 ] [ j ] , c = = ′ a ′ + j i , c ≠ ′ a ′ + j dp[i][j]= \begin{cases} dp[i+1][j], \quad c == 'a'+j\\ i, \quad c \ne 'a'+j \end{cases} dp[i][j]={dp[i+1][j],c==a+ji,c=a+j

d p [ i ] [ j ] dp[i][j] dp[i][j]表示在字符串 t t t中的 i i i位置与其右端最邻近的 j + ′ a ′ j +'a' j+a字符的位置。

这个dp数组的作用,是来加速上面双指针中 j j j指针的跳转。


class Solution {
public:
    bool isSubsequence(string s, string t) {

        
        int n = s.size();
        int m = t.size();

        vector<vector<int>> dp(m + 1, vector<int>(26, m));


        for (int i = m - 1; ~i ; --i) {

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

        int i = 0;
        int j = 0;

        while (i < n && j < m) {
            if (s[i] == t[j]) {
                i++;j++;
            }
            else {
                j = dp[j][s[i] - 'a'];
            }
        }

        return i == n; 
    }
};
2.3 动态规划

可以转换为经典的 L C S ( l o n g e s t   c o m m o n   s e q u e n c e ) LCS(longest\ common\ sequence) LCS(longest common sequence)最长公共子序列问题,

L C S ( s , t ) = s . s i z e ( ) LCS(s,t) =s.size() LCS(s,t)=s.size()

class Solution {
public:
    bool isSubsequence(string s, string t) {
        
        if (s.empty())
            return true;
        
        int m = static_cast<int>( s.size() );
        int n = static_cast<int>( t.size() );

        vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));


        for (int i = 1;i <= m; ++i) {
            for ( int j = 1; j <= n; ++j) {
                if (s[i - 1] == t[j - 1])
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                else
                    dp[i][j] = max( dp[i][j - 1], dp[i - 1][j]);
              }
        }

        return dp[m][n] == m;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Hystrix断路器

Hystrix断路器 概述分布式系统面临的问题什么是Hystrix 服务熔断什么是服务熔断添加方法 服务降级什么是服务降级实现方法 服务监控hystrixDashboard 概述 分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系&#xff0c;每个依赖关系在某些时候不可避免地…

Python网络数据抓取(3):Beautiful Soup

Beautiful Soup 这个库通常被称为Beautiful Soup 4&#xff08;BS4&#xff09;。它主要用来从HTML或XML文件中抓取数据。此外&#xff0c;它也用于查询和修改HTML或XML文档中的数据。 现在&#xff0c;让我们来了解如何使用Beautiful Soup 4。我们将采用上一节中使用的HTML数据…

【优质书籍推荐】ChatGLM3大模型本地化部署、应用开发与微调

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

Latex入门教学——常用语句介绍

目录 一、导言 二、正文 三、图片 四、公式 五、表格 六、参考文献 LaTex模板下载 IEEE模板&#xff1a;IEEE Article Templates - IEEE Author Center Journals通用模板&#xff1a;Overleaf, Online LaTeX Editor其他方法&#xff1a;百度&#xff0c;CSDN等。 一、导…

华为校招机试 - 满二叉搜索树查找(20240424)

在线OJ测试 题目详情 - 满二叉搜索树查找 - HydroOJ 题目描述 给定 (2^n) - 1 个不同的整数(1 ≤ n ≤ 10,n 为整数),构建一棵平衡满二叉搜索树。 二叉搜索树定义如下: 节点的左子树只包含小于当前节点的数节点的右子树只包含大于当前节点的数所有左子树和右子树自身必…

为什么有些3D模型导入总是渲染不出来?---模大狮模型网

在使用3D建模软件时&#xff0c;有时候会遇到一些导入模型后无法正确渲染的问题&#xff0c;这给用户带来了不便和困扰。本文将探讨一些可能导致3D模型无法渲染的原因&#xff0c;并提供解决方案&#xff0c;帮助您顺利渲染模型。 一、文件格式不兼容某些3D建模软件只支持特定的…

SDA616 600KHz、16V、2A同步降压转换器

一般说明 该SDA616是一个完全集成&#xff0c;高效率2A同步整流降压转换器。该SDA616工作在一个宽的输 出电流负载范围高效率。该器件提供两种工作模式&#xff0c;PWM控制和PFM模式开关控制&#xff0c;它允许在更宽的负载范围内的高效率。 该SDA616需要一个现…

电脑开机后卡在开机LOGO画面如何排查处理

当电脑开机后长时间停滞在开机LOGO画面,无法继续进入操作系统,这一现象常令用户困扰不已。本文将深入探讨导致此类问题的多种可能原因,并提供相应的解决方法,帮助你有效地诊断和排除故障。 硬件故障或接触不良 1. 硬盘问题:硬盘是系统启动的关键组件,其故障或数据线接触…

RAG Survey

本文翻译自&#xff1a;Retrieval-Augmented Generation for Large Language Models: A Survey https://arxiv.org/pdf/2312.10997 文章目录 摘要一、INTRODUCTION二、RAG概述A. Naive RAGB. Advanced RAGC. Modular RAGD. RAG与微调 三、 检索A. 检索来源1&#xff09; 数据结…

Qt客服端开发的组件库

Qt 是一个功能丰富的跨平台 C 应用程序框架&#xff0c;它包含了许多用于不同目的的组件库。以下是一些主要的 Qt 组件库&#xff0c;这些库为开发者提供了广泛的工具和功能&#xff0c;以便构建复杂的应用程序。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&a…

短信接口如何快速对接

短信大家都不陌生&#xff0c;基本上我们每天都会收到各种各样的短信&#xff0c;内容有些是营销类的&#xff0c;有些是数字验证码&#xff0c;有些是快递取件码类似的通知短信&#xff0c;这些短信内容都是通过短信接口触发来进行发送的&#xff0c;那么你知道短信接口如何快…

绘制签章 乱码问题 (踩坑日记)

签章汉字乱码问题 原因:我们在docker上因为没有汉字字体需要我们手动把文件打进去 注意点:如果开启了打包过滤加上字体不过滤 绘制签章转载

数海启航:数学与人工智能的深度交织

在人类文明的长河中&#xff0c;数学始终扮演着探秘未知、构建理论框架的基石角色。随着科技的飞速发展&#xff0c;尤其是人工智能&#xff08;AI&#xff09;的兴起&#xff0c;数学与这一前沿领域的结合愈发紧密&#xff0c;成为推动AI进步的最强引擎。 一、数学&#xff1a…

【操作系统复习资料】(持续更新中)

目录 第一章&#xff1a;操作系统引论 第二章&#xff1a;进程的描述与控制 未完待续。。。。。接 第三章&#xff1a;处理机调度与死锁 第四章&#xff1a;存储器管理 第五章&#xff1a;虚拟存储器 第六章&#xff1a;第八节 磁盘存储器的性能和调度 第一章&#xff1a…

Docker深入探索:网络与资源控制、数据管理与容器互联以及镜像生成

目录 一、 Docker网络 &#xff08;一&#xff09;Docker网络实现原理 &#xff08;二&#xff09;Docker网络模式 1. Bridge网络&#xff08;默认&#xff09; 2. Host网络 3. None网络 4. Container网络 5. 自定义网络 二、资源控制 &#xff08;一&#xff09;cgr…

windows下pysqlite3安装

pysqlite3 下载地址&#xff1a;SQLite Download Page windows下安装 首先在官网中下载以下文件 sqlite-amalgamation-3450300.zip #源码文件 sqlite-dll-win-x64-3450300.zip # 根据系统选择32或者64&#xff0c;可通过查看我的电脑属性中查看 sqlite-tools-win-x64-345…

万兆以太网MAC设计(9)数据流仲裁模块

文章目录 一、模块接口二、模块功能描述2.1、实现思路 三、仿真3.1、仿真设计3.2、仿真波形 总结&#xff1a; 一、模块接口 c0和c1表示输入的俩个数据通道&#xff0c;c0优先级高&#xff0c;P_ARBITER_LAYER 表示当前是在IP层进行仲裁还是MAC层&#xff0c;可复用于俩个模块…

每日算法之对称二叉树

题目描述 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 提示&#xff1a; …

c# 构造函数 静态构造函数 内联字段(即静态字段和实例字段) 父类构造函数 父类静态构造函数 父类内联字段 执行顺序

顺序如下&#xff1a; 1.子类的内联字段 2.子类的静态构造函数 3.父类的内联字段 4.父类的静态构造函数 5.父类的构造函数 6.子类的构造函数 7.子类的方法 public class A{public static string a1"A0";static A(){Console.WriteLine("父类内联字段&#xff1a;…

内网安全【1】——域信息收集/应用网络凭证/CS插件/Android/BloodHound

内容大纲&#xff1a; 概念名词&#xff1a; 局域网 &#xff08;自己家&#xff09; 工作组 &#xff08;网吧&#xff09; 内网域 &#xff08;公司&#xff09; 比如一家公司有1000台机器 运维人员去管理1000 不可能每台上去都进行软件的安装 环境的部署 密码的设置…