当前位置: 首页 > article >正文

LeetCode算法题(Go语言实现)_11

题目

给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。
进阶:
如果有大量输入的 S,称作 S1, S2, … , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?

一、代码实现

基础解法(双指针法)
func isSubsequence(s string, t string) bool {i, j := 0, 0for i < len(s) && j < len(t) {if s[i] == t[j] {i++}j++}return i == len(s)
}
进阶解法(预处理+二分搜索)
func isSubsequenceAdvanced(s string, t string) bool {// 预处理:记录每个字符在t中的位置index := make(map[byte][]int)for i := 0; i < len(t); i++ {c := t[i]index[c] = append(index[c], i)}// 匹配s的每个字符currentPos := 0for i := 0; i < len(s); i++ {c := s[i]positions, exists := index[c]if !exists {return false}// 二分查找第一个>=currentPos的位置pos := sort.SearchInts(positions, currentPos)if pos == len(positions) {return false}currentPos = positions[pos] + 1}return true
}

二、算法分析

1. 核心思路
  • 双指针法:通过两个指针同步遍历 st,匹配字符后移动 s 指针,最终判断 s 是否遍历完成。
  • 预处理优化:针对大量 s 输入的情况,预处理 t 的结构(记录每个字符的索引位置),使用二分查找快速定位匹配位置,减少重复遍历 t 的时间。
2. 关键步骤
  1. 双指针法

    • 初始化 i(指向 s)和 j(指向 t)为0。
    • 每次匹配成功时 ij 同时右移,否则仅 j 右移。
    • i 遍历完 s 时返回 true
  2. 预处理优化

    • 构建哈希表,记录 t 中每个字符的所有出现位置。
    • 对每个 s 的字符,在其对应的位置列表中二分查找第一个不小于当前匹配位置的值。
3. 复杂度
方法时间复杂度空间复杂度适用场景
双指针法O(n)(n为t长度)O(1)单次查询
预处理+二分查找O(mlogk)O(n)大量查询(k≥10亿次)

三、图解

在这里插入图片描述

四、边界条件与扩展

1. 边界条件
  • s为空:空字符串是任何字符串的子序列。
  • t为空:若s非空则返回false
  • s比t长:直接返回false
2. 扩展验证
  • 大规模数据:预处理方法可在O(1)时间内完成单次查询(预处理时间O(n))。
  • 特殊字符:算法天然支持所有ASCII字符(需扩展哈希表范围)。
3. 算法对比
方法优势劣势
双指针法代码简单,空间O(1)无法应对大量查询
动态规划可复用LCS逻辑时间O(mn),空间O(mn)
预处理+二分查找处理10亿级查询时效率高预处理时间O(n)

五、总结

  • 核心逻辑:双指针法通过同步遍历快速判断子序列关系,时间复杂度为O(n);预处理方法通过空间换时间优化高频查询场景。
  • 优化点
    1. 双指针法的贪心策略确保匹配位置的最左对齐,避免回溯。
    2. 预处理方法利用哈希表+二分查找将单次查询复杂度降为O(mlogk)。
  • 应用场景:实时数据流中的子序列匹配(如日志分析)、高频查询系统设计(如API服务)。

相关文章:

LeetCode算法题(Go语言实现)_11

题目 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;"ace"是"abcde"的一个子序列&a…...

Python----数据分析(足球运动员数据分析)

一、数据展示 1.1、数据 1.2、列名 字段名备注Name姓名Nationality国籍National_Position国家队位置National_Kit国家队号码Club所在俱乐部Club_Position所在俱乐部位置Club_Kit俱乐部号码Club_Joining加入俱乐部时间Contract_Expiry合同到期时间Rating评分Height身高Weight体…...

Day38 | 1365. 有多少小于当前数字的数字、941. 有效的山脉数组、1207. 独一无二的出现次数、283. 移动零、189. 轮转数组

1365. 有多少小于当前数字的数字 题目链接&#xff1a;1365. 有多少小、于当前数字的数字 - 力扣&#xff08;LeetCode&#xff09; 题目难度&#xff1a;简单 代码&#xff1a; class Solution {public int[] smallerNumbersThanCurrent(int[] nums) {Map<Integer,Inte…...

Docker-清理容器空间prune

docker system prune -a 是一个非常有用的命令&#xff0c;用于清理 Docker 系统中未使用的资源&#xff0c;包括停止的容器、未使用的网络、卷以及未被任何容器引用的镜像&#xff08;悬空镜像和所有未使用的镜像&#xff09;。以下是关于该命令的详细说明&#xff1a; 命令格…...

matplotlib——南丁格尔玫瑰

南丁格尔玫瑰图&#xff08;Nightingale Rose Chart&#xff09;&#xff0c;是一种特殊形式的柱状图&#xff0c;它以南丁格尔&#xff08;Florence Nightingale&#xff09;命名&#xff0c;她在1858年首次使用这种图表来展示战争期间士兵死亡原因的数据。 它将数据绘制在极坐…...

Django与网页表单

我叫补三补四&#xff0c;很高兴见到大家&#xff0c;欢迎一起学习交流和进步 今天来讲一讲网页表单 网页表单又叫做HTML表单&#xff0c;用来处理用户从页面输入发送到服务器的数据&#xff0c;页面表单通常会提供复选框、单选按钮和文本字段&#xff0c;方便用户填写各种形式…...

Rust从入门到精通之入门篇:10.包和模块

包和模块 在本章中&#xff0c;我们将学习 Rust 的包和模块系统&#xff0c;它们是组织和重用代码的重要工具。随着项目规模的增长&#xff0c;良好的代码组织变得越来越重要&#xff0c;Rust 提供了一套强大的机制来管理代码结构。 包和 Crate Crate Crate 是 Rust 中最高…...

ChatDBA VS DeepSeek:快速诊断 OceanBase 集群新租户数据同步异常

社区王牌专栏《一问一实验&#xff1a;AI 版》改版以来已发布多期&#xff08;51-60&#xff09;&#xff0c;展现了 ChatDBA 在多种场景下解决问题的效果。 下面让我们正式进入《一问一实验&#xff1a;AI 版》第 62 期&#xff0c;看看 ChatDBA 最新效果以及与热门大模型 De…...

dify忘记密码

特别好&#xff0c;非常好&#xff0c;一把年纪忘了dify的账号、密码了&#xff0c;very good&#xff01;&#xff01;&#xff01; 参考如下教程 https://zhuanlan.zhihu.com/p/24515387167 rootbae577d82ec7:/# psql -U postgres psql: error: connection to server on so…...

Python----计算机视觉处理(Opencv:图像边缘检测:非极大值抑制,双阈值筛选)

一、 高斯滤波 边缘检测本身属于锐化操作&#xff0c;对噪点比较敏感&#xff0c;所以需要进行平滑处理。这里使用的是一个5*5的高斯 核对图像进行消除噪声。 二、计算图像的梯度和方向 三、非极大值抑制 在得到每个边缘的方向之后&#xff0c;其实把它们连起来边缘检测就算完了…...

vue3(笔记)5.0--pinia工具的知识扩展

pinia工具 defineStore(创建pinia) 作用&#xff1a;用于定义一个 Pinia store。 用法&#xff1a; 接收一个唯一的 ID 和一个配置对象&#xff0c;配置对象中可以定义 state、getters 和 actions。state 是一个函数&#xff0c;返回初始状态。getters 类似于 Vue 组件中的计…...

基于Kubernetes部署Prometheus监控平台

#作者&#xff1a;stackofumbrella 文章目录 prometheus和k8s集群版本对照表架构Prometheus Operator简介kube-prometheus下载地址 安装修改镜像地址修改Prometheus的service修改Grafana的service修改Alertmanager的service数据持久化执行安装 Prometheus验证Grafana验证解决C…...

往期项目shader着色器实践效果应用合集

1、管路混色 2、水管水流效果 3、水管流入到流完效果 4、加热冷却 两 色混色 示意 XX、毒蘑菇测试效果...

如何在 React 项目中使用React.lazy和Suspense实现组件的懒加载?

大白话如何在 React 项目中使用React.lazy和Suspense实现组件的懒加载&#xff1f; 在 React 项目里&#xff0c;有时候组件功能多、体积大&#xff0c;要是一次性把所有组件都加载进来&#xff0c;网页加载速度就会变慢。而 React 提供了 React.lazy 和 Suspense 这两个好东西…...

绿色暴政:Relax Max如何用军工科技定义环保新标准

《绿色暴政&#xff1a;Relax Max如何用军工科技定义环保新标准》 ——从隐形战斗机涂层到零碳卫浴的降维打击 &#xff08;洛克希德马丁实验室&#xff0c;2023年&#xff09;当F-35战斗机的隐形涂料配方被改写为卫浴釉料时&#xff0c;环保产业迎来了最硬核的颠覆者。Relax…...

蓝桥杯刷题 Day 4 栈与链表

蓝桥杯刷题 Day 4 栈与链表 文章目录 蓝桥杯刷题 Day 4 栈与链表前言一、栈1. 解题思路2. 拆解代码&#xff08;不复杂&#xff0c;不拆了&#xff09; 二、链表1. 解题思路1.1 主函数1.2 自定义列表类1.2.1 插入操作1.2.2 删除操作1.2.3 按要求输出 三、 题后收获3.1 知识点 前…...

第十三届蓝桥杯单片机省赛程序设计试题

目录 试题 各程序块代码 init.c main.c other.h other.c key.c seg.c onewire.c部分 ds1302.c部分 试题 各程序块代码 init.c #include "other.h"void init74hc138(unsigned char n){P2(P2&0x1f)|(n<<5);P2&0x1f; } void init(){P00x00;in…...

QOpenGLWidget动态加载功能实现教程(Qt+OpenGL)

QOpenGLWidget动态加载功能实现教程 我需要在Qt里面使用QOpenGLWidget显示OpenGL窗口&#xff0c;并且需要实现加载模型后重新渲染更新窗口的功能&#xff0c;但是一直无法更新被卡住了&#xff0c;现在把问题解决了总结一下整个实现过程。 创建一个自己的OpenGLWidget类 QOp…...

机器学习正则化技术:Ridge、Lasso与ElasticNet全解析

机器学习中的正则化技术 在机器学习中&#xff0c;正则化技术&#xff08;如 Ridge 和 Lasso&#xff09;主要用于解决过拟合问题&#xff0c;通过限制模型复杂度提高泛化能力。以下是详细说明及实例代码&#xff1a; 一、正则化解决的问题 过拟合&#xff1a;模型在训练集表…...

数字转换(c++)

【题目描述】 如果一个数 xx 的约数和 yy &#xff08;不包括他本身&#xff09;比他本身小&#xff0c;那么 xx 可以变成 yy &#xff0c;yy 也可以变成 xx 。例如 44 可以变为 33 &#xff0c;11 可以变为 77 。限定所有数字变换在不超过 nn 的正整数范围内进行&#xff0c;…...

ESP32驱动BMP280和MQ4传感器

文章目录 前言 一、硬件准备 所需组件 连接方式&#xff1a; 二、软件实现 1.所需库 2.代码实现 效果演示 三、上传Qt端 前言 在物联网和环境监测应用中&#xff0c;传感器是获取环境数据的关键组件。本文将详细介绍如何使用ESP32微控制器同时驱动BMP280大气压力传感器…...

洛谷题单1-B2002 Hello,World!-python-流程图重构

题目描述 编写一个能够输出 Hello,World! 的程序。 提示&#xff1a; 使用英文标点符号&#xff1b;Hello,World! 逗号后面没有空格。H 和 W 为大写字母。 输入格式 无 输出格式 无 输入输出样例 #1 输入 #1 无输出 #1 Hello,World!方式-print() 代码 class Solut…...

MQTT协议笔记

消息格式 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的消息协议&#xff0c;专为低带宽、高延迟或不可靠的网络设计&#xff0c;广泛应用于物联网&#xff08;IoT&#xff09;设备之间的通信。MQTT消息体的结构遵循MQTT协议规范&#xff0…...

CentOS系统下安装tesseract-ocr5.x版本

CentOS系统下安装tesseract-ocr5.x版本 安装依赖包&#xff1a; yum update -y yum install autoconf automake libtool libjpeg-devel libpng-devel libtiff-devel zlib-devel yum install automake libtool bzip2 -y手动编译安装GCC&#xff08;因系统默认安装的GCC版本比较…...

“征服HTML引号恶魔:“完全解析手册”!!!(quot;表示双引号)

&#x1f6a8;&#x1f4e2; "征服HTML引号恶魔&#xff1a;“完全解析手册” &#x1f4e2;&#x1f6a8; &#x1f3af; 博客引言&#xff1a;当引号变成"恶魔" &#x1f631; 是否遇到过这种情况&#xff1a; 写HTML时满心欢喜输入<div title"他…...

如何使用VS中的Android Game Development Extension (AGDE) 来查看安卓 Logcat 日志

一、首先按照以下 指引 中的 第1、2步骤&#xff0c;安装一下 AGDE &#xff0c;AGDE 的安装包可以在官网上找到。 UE4 使用AndroidGameDevelopmentExtension&#xff08;AGDE&#xff09;对安卓客户端做“断点调试”与“代码热更”-CSDN博客 在执行第二步骤前&#xff0c;记得…...

VSCode 生成HTML 基本骨架

在VSCode 新建html文件中敲一个英文感叹号 ! <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><titl…...

【Spring AI】基于专属知识库的RAG智能问答小程序开发——功能优化:用户鉴权相关工具类代码

系列文章目录 【Spring AI】基于专属知识库的RAG智能问答小程序开发——完整项目&#xff08;含完整前端后端代码&#xff09;【Spring AI】基于专属知识库的RAG智能问答小程序开发——代码逐行精讲&#xff1a;核心ChatClient对象相关构造函数【Spring AI】基于专属知识库的R…...

Solr-搜索引擎-入门到精通

以下是对 Apache Solr 的简介及其常用语法的快速入门指南&#xff1a; 一、Solr 是什么&#xff1f; • 核心定位&#xff1a;Apache Solr 是一个基于 Lucene 的高性能、开源的搜索平台&#xff0c;支持全文检索、分词、高亮、聚合统计等功能。 • 核心功能&#xff1a; • 全…...

07_GRU模型

GRU模型 双向GRU笔记:https://blog.csdn.net/weixin_44579176/article/details/146459952 概念 GRU&#xff08;Gated Recurrent Unit&#xff09;也称为门控循环单元&#xff0c;是一种改进版的RNN。与LSTM一样能够有效捕捉长序列之间的语义关联&#xff0c;通过引入两个&qu…...