LeetCode 467 环绕字符串中唯一的子字符串


文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
      • 核心逻辑拆解
        • 什么叫“连续环绕”?
        • `currentLen` 在干嘛?
        • 为什么 `dp[index] = max(dp[index], currentLen)`?
    • 示例测试及结果
      • 示例 1
      • 示例 2
      • 示例 3
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

这道题第一眼看很容易被“子字符串”“不同”“无限环绕字符串”这些词劝退,但实际上它是一个典型的“计数型动态规划”问题

真正的难点不在字符串本身,而在于:

  • 怎么避免重复统计
  • 怎么在O(n)的复杂度里算清楚所有可能的子串数量

如果你平时做过日志切片、连续事件统计、或者字符串规则分析,这道题的解法思路会非常熟悉。

描述

题目先定义了一个“看起来很吓人”的字符串base

"...zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd..."

它的特点其实只有一个:

  • 字母是连续递增的
  • 'z'后面可以接'a'

然后问题来了:

给你一个字符串s,统计s中有多少个不同的非空子串
同时也能在base中出现。

注意几个关键信息:

  1. 子串是连续的
  2. 要求不同(不能重复算)
  3. 子串本身必须满足字母连续 + 可 z→a

题解答案

这道题如果暴力枚举子串:

  • 子串数量是 O(n²)
  • 再去判定是否在base中,直接爆炸

真正高效的解法只有一句话:

记录每个字母作为结尾时,最多能形成多长的“连续环绕子串”

核心思想是:

  • 只关心“以某个字符结尾”的最长合法子串
  • 同一个结尾字符,短的子串一定包含在长的里面
  • 所以只统计“最长的那一条”就够了

题解代码分析

下面是完整 Swift 实现,可以直接复制运行。

classSolution{funcfindSubstringInWraproundString(_s:String)->Int{letchars=Array(s)ifchars.isEmpty{return0}// dp[i] 表示:以字符 ('a' + i) 结尾的最长连续子串长度vardp=[Int](repeating:0,count:26)varcurrentLen=0foriin0..<chars.count{ifi>0&&isContinuous(chars[i-1],chars[i]){currentLen+=1}else{currentLen=1}letindex=Int(chars[i].asciiValue!-Character("a").asciiValue!)dp[index]=max(dp[index],currentLen)}returndp.reduce(0,+)}privatefuncisContinuous(_a:Character,_b:Character)->Bool{letaVal=a.asciiValue!letbVal=b.asciiValue!returnbVal==aVal+1||(a=="z"&&b=="a")}}

核心逻辑拆解

什么叫“连续环绕”?

合法情况只有两种:

  • 'a' -> 'b' -> 'c'
  • 'z' -> 'a'
bVal==aVal+1||(a=="z"&&b=="a")

这就是base的全部规则,没有其他花样。

currentLen在干嘛?

currentLen表示:

当前这个字符,能接在前一个字符后面,形成多长的合法子串

比如:

s = "zab"

扫描过程是:

  • 'z'→ currentLen = 1
  • 'a'→ 连续 → currentLen = 2
  • 'b'→ 连续 → currentLen = 3
为什么dp[index] = max(dp[index], currentLen)

这是整道题最关键的一步。

'b'结尾:

  • "b"是合法
  • "ab"是合法
  • "zab"也是合法

但如果你已经有了长度为 3 的"zab"

  • 长度为 1、2 的子串一定已经包含在里面
  • 再统计就会重复

所以我们只保留最长的那个

示例测试及结果

示例 1

letsolution=Solution()print(solution.findSubstringInWraproundString("a"))

分析:

  • 只有一个子串"a"
  • 合法

输出:

1

示例 2

print(solution.findSubstringInWraproundString("cac"))

分析:

  • "c"合法
  • "a"合法
  • "ca"不合法(不是连续)
  • "ac"不合法

输出:

2

示例 3

print(solution.findSubstringInWraproundString("zab"))

分析:

  • "z","a","b"
  • "za","ab"
  • "zab"

一共 6 个。

输出:

6

时间复杂度

整个算法只做了一次线性扫描:

O(n)

n是字符串s的长度,最大 10⁵,完全没压力。

空间复杂度

只用了一个固定长度的数组:

dp[26]

空间复杂度:

O(1)

总结

《环绕字符串中唯一的子字符串》是一道非常典型的“看起来复杂,其实规律极强”的题

它真正想考你的不是字符串 API,而是:

  • 能不能把“不同子串”这个问题压缩成状态统计
  • 能不能意识到:
    同一个结尾字符,只需要记最长那条

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

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

相关文章

网络安全到底防什么?核心防护技术全景解读与关键策略

1&#xff1a;网络基础知识 Internet通过TCP/IP协议将遍布在全世界各地的计算机互联&#xff0c;从而形成超大的计算机网络。 2&#xff1a; 3&#xff1a;网络协议层模型 4&#xff1a;通信网络地址的发出点为源地址&#xff0c;接收点为目的地址&#xff1b; 在通信网络中&…

【心率检测】加速度计的呼吸速率和心率检测【含Matlab源码 14855期】含报告

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab武动乾坤博客之家&#x1f49e;…

为什么 Flutter 的性能问题,更像“前端问题”,而不是“原生问题”?

网罗开发&#xff08;小红书、快手、视频号同名&#xff09;大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等方…

CP探针卡类型

CP探针主要分为悬臂式、垂直式和MEMS三种类型&#xff0c;价格差异主要体现在结构复杂度和应用场景上。 一、CP探针类型 悬臂式探针卡‌ 特点‌&#xff1a;体积大、探针直径大&#xff0c;间距和数量受限&#xff0c;适用于焊垫或凸块尺寸较大的芯片&#xff08;如传统Anal…

网络安全核心架构:一张图看懂关键技术与攻防体系

网络安全技术虽然非常复杂&#xff0c;但是归纳起来&#xff0c;主要就是为了解决以下三方面问题&#xff1a; 1.数据的机密性&#xff1a;即如何令人们发送数据&#xff0c;即使被其他无关人员截取&#xff0c;他们也无法获知数据的含义。 2.数据的有效性&#xff1a;指数据不…

AbortController 深度解析:Web 开发中的“紧急停止开关”

在现代 Web 开发中&#xff0c;异步操作&#xff08;如网络请求、定时器、事件监听&#xff09;无处不在。然而&#xff0c;如何优雅地终止这些不再需要的异步操作&#xff0c;长期以来一直是前端开发中的一个痛点。 AbortController 作为一个标准的 Web API&#xff0c;为开发…

【优化部署】粒子群算法PSO异构节点智能部署策略(延长无线传感器网络寿命)【含Matlab源码 14849期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab武动乾坤博客之家&#x1f49e;…

Web Worker 性能优化实战:将计算密集型逻辑从主线程剥离的正确姿势

在前端开发中&#xff0c;用户体验的流畅度往往取决于“主线程”的响应速度。然而&#xff0c;随着 Web 应用功能的日益复杂&#xff0c;浏览器在处理图像处理、大型二维码生成或复杂数据转换时&#xff0c;常常会出现页面瞬时卡顿甚至假死。 欢迎访问我的个人网站 https://hix…

【Redis】双重判定锁详解:缓存击穿的终极解决方案

双重判定锁详解&#xff1a;缓存击穿的终极解决方案 前言 这篇是微服务全家桶系列的学习笔记&#xff0c;这次整理的是分布式场景下的双重判定锁&#xff08;Double-Checked Locking&#xff0c;简称 DCL&#xff09;。 最近在做短链接跳转这块业务&#xff0c;遇到了一个挺…

垃圾回收算法

垃圾回收的概念垃圾回收&#xff08;Garbage Collection&#xff0c;简称GC&#xff09;,顾名思义就是释放垃圾占用的空间&#xff0c;防止内存爆掉。有效的使用可以使用的内存&#xff0c;对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。垃圾判断算法既然JVM要…

一张图理清网络安全核心框架:体系、模型与标准体系的演进之路

网络安全体系概述 4.1.1 网络安全体系概述 一般面言&#xff0c;网络安全体系是网络安全保障系统的最高层概念抽象&#xff0c;是由各种网络安全单元按照一定的规则组成的&#xff0c;共同实现网络安全的目标。网络安全体系包括法律法规政策文件、安全策略、组织管理、技术措…

网络安全防护实战指南:关键技术演进与现代企业级解决方案

1&#xff1a;网络基础知识 Internet通过TCP/IP协议将遍布在全世界各地的计算机互联&#xff0c;从而形成超大的计算机网络。 2&#xff1a; 3&#xff1a;网络协议层模型 4&#xff1a;通信网络地址的发出点为源地址&#xff0c;接收点为目的地址&#xff1b; 在通信网络中&…

慢思考,深搜索:MiroThinker 1.5 如何重塑 AI 研究智能体范式

前言过去两年&#xff0c;AI 的主流叙事始终围绕“更快、更强、更聪明”展开。大模型竞相堆叠参数&#xff0c;响应速度被压缩到毫秒级&#xff0c;对话流畅度几乎以假乱真。这种进化路径在日常问答、内容生成等场景中确实带来了显著体验提升。但当我们面对需要深度调研、逻辑推…

一文读懂探针卡的概念、组成、分类以及应用

探针卡&#xff08;Probe Card&#xff09;在集成电路测试中起着至关重要的作用&#xff0c;尤其在晶圆测试&#xff08;wafer test&#xff09;环节&#xff0c;探针卡作为连接ATE测试机台和半导体晶圆之间的接口&#xff0c;确保了在芯片封装前对其电学性能进行初步测量和筛选…

从入门到精通:网络安全核心技术栈详解与实践路线图

网络安全技术虽然非常复杂&#xff0c;但是归纳起来&#xff0c;主要就是为了解决以下三方面问题&#xff1a; 1.数据的机密性&#xff1a;即如何令人们发送数据&#xff0c;即使被其他无关人员截取&#xff0c;他们也无法获知数据的含义。 2.数据的有效性&#xff1a;指数据不…

探讨 ‘Memory-augmented Retrieval’:利用历史对话的 Checkpoint 作为查询权重,提升检索的相关性

尊敬的各位同仁&#xff0c;欢迎来到本次关于“Memory-augmented Retrieval”的讲座。今天我们将深入探讨如何利用历史对话的“Checkpoint”作为查询权重&#xff0c;显著提升检索系统的相关性&#xff0c;尤其是在多轮对话和复杂交互场景中。在当今的AI时代&#xff0c;检索增…

论文降aigc保姆级教程:手把手教你免费降ai率,告别高ai焦虑。

最近太多人私信我&#xff1a;“论文AI率太高怎么办&#xff1f;连人工改的都不过检测&#xff01;” 这事儿我太懂了——前段时间我自己也被AI检测折磨得快崩溃。 市面上一堆打着“降低AI率”旗号的网站&#xff0c;不是乱扣格式&#xff0c;就是改完反而更像AI写的。 所以我…

腾讯云VOD AIGC视频生成工具 回调实现

腾讯云VOD AIGC视频生成工具 一个功能完整的腾讯云VOD AIGC视频生成工具库&#xff0c;支持轮询模式和回调模式两种获取结果方式。 目录结构 test/vod/ ├── tencent_aigc_video.py # 核心库&#xff1a;API封装、任务管理 ├── config.py # 配置文件&a…

基于yolov11实现车辆速度估计+距离测量+轨迹跟踪+区域进出统计python源码实现

这个是网上目前可能唯一一个使用不足一百行代码实现了复杂车辆速度估计距离测量轨迹跟踪区域进出统计系统。之所以这么简单是因为ultralytics模块现在已经成熟而且强大&#xff0c;不需要从头开始写车辆速度估计、距离测量、轨迹跟踪、区域进出统计系统代码&#xff0c;因为里面…