Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
求解最长无重复子串长度:滑动窗口算法的时间复杂度分析与优化_创想鸟

求解最长无重复子串长度:滑动窗口算法的时间复杂度分析与优化

求解最长无重复子串长度:滑动窗口算法的时间复杂度分析与优化

本文旨在深入解析求解字符串中最长无重复子串长度的滑动窗口算法。我们将分析一种常见的实现方式,指出其潜在的时间复杂度问题,并提供一种更优的、时间复杂度为 O(n) 的解决方案。通过代码示例和详细解释,帮助读者理解算法原理并掌握优化技巧。

问题描述

给定一个字符串,找出其中最长且不包含重复字符的子串的长度。例如:

输入 “abcabcbb”,答案是 3 (对应子串 “abc”)输入 “bbbbb”,答案是 1 (对应子串 “b”)输入 “pwwkew”,答案是 3 (对应子串 “wke”)

初始方案分析

最初的解决方案采用滑动窗口的思想,使用一个对象 (storage.cache) 来缓存字符及其索引。虽然看起来像是滑动窗口,但由于在遇到重复字符时,存在一个内部循环,导致其时间复杂度并非严格的 O(n)。

以下是原始代码:

var lengthOfLongestSubstring = function(str) {    // Create storage object for caching    let storage = {        longestSubStringLength: 0,        longestSubString: 0,        cache: {            subString: ''        }    };    // Loop through string    for (let i = 0; i < str.length; i++) {        let char = str[i];        if (!storage.cache[char] && storage.cache[char] !== 0) {            // If current letter is not in storage, add it and extend current substring            storage.cache[char] = i;            storage.cache.subString += char;        } else {            // If current letter is already in storage, start a new round            let previousCache = storage.cache;            storage.cache = {                subString: ''            };            if (previousCache[char] + 1 !== i) { // If there are letters in-between                storage.cache.subString = str.substring(previousCache[char] + 1, i);                for (let j = previousCache[char]; j  storage.longestSubStringLength) {            storage.longestSubStringLength = storage.cache.subString.length;            storage.longestSubString = storage.cache.subString;        }    }    return storage.longestSubStringLength;};

问题在于 else 分支中的内部 for 循环:

for (let j = previousCache[char]; j < i; j++) {    storage.cache[str[j]] = j;}

这个循环在遇到重复字符时,会迭代更新 storage.cache 中位于重复字符之间的字符的索引。在最坏情况下,例如 “abcdefghabcdefgh”,这个内部循环可能会执行多次,导致整体时间复杂度高于 O(n)。 更准确地说,其时间复杂度接近 O(n*m),其中 m 是最长不重复子串的平均长度。

优化方案:O(n) 时间复杂度的滑动窗口

为了实现真正的 O(n) 时间复杂度,我们可以使用 Map 数据结构来存储字符及其索引。Map 提供了快速的查找和更新操作。

以下是优化后的代码:

const lengthOfLongestSubstring = str => {    let cnt = 0;    let n = str.length;    let answer = 0;    let map = new Map(); // to store the strings and their length    for (let start = 0, end = 0; end  console.log(lengthOfLongestSubstring(str).join(" ")))

代码解释:

map: 使用 Map 来存储字符及其在字符串中的下一个位置(索引 + 1)。start 和 end: start 指向当前无重复子串的起始位置,end 指向当前遍历的字符。滑动窗口: end 指针不断向右移动,扩展窗口。重复字符处理: 如果 map 中已经存在当前字符 str[end],则将 start 指针移动到 map.get(str[end]) 和当前 start 的较大值处。 这是关键步骤,确保 start 始终指向当前无重复子串的有效起始位置。Math.max 的使用是为了避免 start 指针回退,这种情况可能发生在字符串中字符重复出现多次,且重复字符的索引小于当前的 start 值。更新最大长度: 每次迭代都更新 answer,即最长无重复子串的长度。更新 map: 将当前字符 str[end] 及其下一个位置 end + 1 存入 map。

时间复杂度分析:

外层循环 for (let start = 0, end = 0; end Map 的 has、get 和 set 操作的平均时间复杂度为 O(1)。

因此,整体时间复杂度为 O(n)。

空间复杂度分析:

空间复杂度为 O(min(m, n)),其中 m 是字符集的大小,n 是字符串的长度。这是因为 Map 最多存储 m 个不同的字符及其索引。

总结

通过使用 Map 数据结构和滑动窗口技术,我们可以高效地解决最长无重复子串问题,并将时间复杂度优化到 O(n)。 关键在于正确地维护滑动窗口的起始位置,并利用 Map 快速查找和更新字符的索引。 这种方法不仅提高了效率,还使代码更简洁易懂。

以上就是求解最长无重复子串长度:滑动窗口算法的时间复杂度分析与优化的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1515787.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Next.js 并行路由与根布局插槽冲突问题解决
上一篇 2025年12月20日 09:34:39
利用 Leaflet 实现 GeoJSON 图层按属性过滤显示
下一篇 2025年12月20日 09:34:46

相关推荐

  • 百度极速版如何查看缓存大小_百度极速版缓存管理的实用技巧

    百度极速版如何查看缓存大小_百度极速版缓存管理的实用技巧百度极速版如何查看缓存大小_百度极速版缓存管理的实用技巧百度极速版如何查看缓存大小_百度极速版缓存管理的实用技巧百度极速版如何查看缓存大小_百度极速版缓存管理的实用技巧

    打开手机设置,进入应用管理找到百度极速版,可查看其缓存和数据占用;2. 在App内“我的”-“设置”中点击“清理缓存”并一键清理,清除临时文件不影响账号;3. 建议每月检查并清理,减少视频自动播放等功能可降低缓存增长,保持App流畅运行。 想知道百度极速版占了多少手机空间?直接在手机设置里就能看清楚…

    2026年10月3日 • 用户投稿
    200
  • 我们如何查看特定 MySQL 数据库中存储函数的列表以及其他一些信息?

    我们如何查看特定 MySQL 数据库中存储函数的列表以及其他一些信息?我们如何查看特定 MySQL 数据库中存储函数的列表以及其他一些信息?我们如何查看特定 MySQL 数据库中存储函数的列表以及其他一些信息?我们如何查看特定 MySQL 数据库中存储函数的列表以及其他一些信息?

    我们可以通过以下查询查看特定 MySQL 数据库中存储函数的列表以及其他信息 – 序列猴子开放平台 具有长序列、多模态、单模型、大数据等特点的超大规模语言模型 0 查看详情 mysql> SHOW FUNCTION STATUS WHERE db = ‘query’G*******…

    2026年10月3日 • 用户投稿
    200
  • yii2.0框架是什么意思?

    yii2.0框架是什么意思?yii2.0框架是什么意思?yii2.0框架是什么意思?yii2.0框架是什么意思?

    Yii是一个高性能的PHP5的web应用程序开发框架,用于开发大型Web应用。通过一个简单的命令行工具 yiic 可以快速创建一个web应用程序的代码框架,开发者可以在生成的代码框架基础上添加业务逻辑,以快速完成应用程序的开发。 而yii2.0是Yii框架的2.0版本。因Yii2.0版框架是完全重写…

    2026年10月3日 • 用户投稿
    100
  • 优化JPA查询性能:利用Tuple和Java Stream高效处理复杂关联数据

    优化JPA查询性能:利用Tuple和Java Stream高效处理复杂关联数据优化JPA查询性能:利用Tuple和Java Stream高效处理复杂关联数据优化JPA查询性能:利用Tuple和Java Stream高效处理复杂关联数据优化JPA查询性能:利用Tuple和Java Stream高效处理复杂关联数据

    本文探讨了在JPA/JPQL中处理复杂关联数据(特别是集合类型字段)时的性能瓶颈及优化策略。针对JPQL缺乏类似Oracle COLLECT函数的聚合能力,文章提出了一种高效解决方案:通过JPQL查询返回Tuple结果集,然后在应用程序层利用Java Stream API进行数据分组和映射。此方法显…

    2026年10月3日 • 用户投稿
    000
  • win10更新卡在“正在配置Windows更新”_解决win10更新卡在配置界面的方法

    win10更新卡在“正在配置Windows更新”_解决win10更新卡在配置界面的方法win10更新卡在“正在配置Windows更新”_解决win10更新卡在配置界面的方法win10更新卡在“正在配置Windows更新”_解决win10更新卡在配置界面的方法win10更新卡在“正在配置Windows更新”_解决win10更新卡在配置界面的方法

    若系统卡在“正在配置Windows更新”界面,可尝试硬重启、进入安全模式暂停更新、使用SFC与DISM修复系统文件、重置Windows Update服务或手动清除SoftwareDistribution缓存以恢复更新流程。 如果您在完成Windows 10更新下载后,系统长时间停留在“正在配置Win…

    2026年10月3日 • 用户投稿
    000
  • 外媒:配备M5心片的MacBook Pro或将在本月正式发布

    据最新传闻,苹果可能计划在发布配备m5 pro和m5 max芯片的高端macbook pro前,先推出一款搭载标准m5芯片的基础版macbook pro。 报道称,这款配备M5芯片的MacBook Pro已经进入预备发布的阶段,并且苹果一直在使用未发布的 macOS 26.0.2进行测试。而配备M5…

    2026年10月3日
    000
  • 火山引擎发布命令行 AI Agent:veCLI

    火山引擎发布命令行 AI Agent:veCLI火山引擎发布命令行 AI Agent:veCLI火山引擎发布命令行 AI Agent:veCLI火山引擎发布命令行 AI Agent:veCLI

    https://www.php.cn/link/801f7c385478d949ce0cdc2640450f89 火山引擎正式发布命令行AI智能助手veCLI,深度集成豆包大模型1.6版本。通过将先进的人工智能能力嵌入命令行环境,veCLI让开发者在无需切换工具的前提下,即可享受智能化的全流程开发支…

    2026年10月3日 • 用户投稿
    000
  • 《速度与激情 街机版》登陆全主机平台 10月24日上线

    《速度与激情 街机版》登陆全主机平台 10月24日上线《速度与激情 街机版》登陆全主机平台 10月24日上线《速度与激情 街机版》登陆全主机平台 10月24日上线《速度与激情 街机版》登陆全主机平台 10月24日上线

    近日,gamemill entertainment 联合 cradle games 正式宣布,《速度与激情:街机版》(fast & furious: arcade edition)将于10月24日登陆 playstation 5、xbox series 以及 switch 平台。官方同步发布…

    2026年10月3日 • 用户投稿
    000
  • DeepSeek润色学术论文:语言提升与逻辑优化要点

    DeepSeek润色学术论文:语言提升与逻辑优化要点DeepSeek润色学术论文:语言提升与逻辑优化要点DeepSeek润色学术论文:语言提升与逻辑优化要点DeepSeek润色学术论文:语言提升与逻辑优化要点

    deepseek润色学术论文的核心在于提升语言表达的精确性和逻辑结构的严谨性,具体包括以下方面:1. 语言润色:替换模糊词汇为具体表述、精简句子结构、使用学术化表达、检查术语正确性、避免口语化语言;2. 逻辑优化:梳理论证思路、检查论证完整性、优化章节结构、确保引用准确、实现前后呼应;3. 使用ai…

    2026年10月3日 • 用户投稿
    000
  • 谷歌浏览器怎么管理网站权限_谷歌浏览器网站权限设置与管理

    谷歌浏览器怎么管理网站权限_谷歌浏览器网站权限设置与管理谷歌浏览器怎么管理网站权限_谷歌浏览器网站权限设置与管理谷歌浏览器怎么管理网站权限_谷歌浏览器网站权限设置与管理谷歌浏览器怎么管理网站权限_谷歌浏览器网站权限设置与管理

    1、可通过调整谷歌浏览器权限解决网站功能受限问题。首先可针对单个网站,在地址栏锁形图标中修改摄像头、定位等权限;2、通过设置中的隐私与安全选项,批量管理已授权网站,删除不必要的访问许可;3、在网站设置中配置默认全局策略,将敏感权限设为“询问”以加强控制;4、使用隐身模式临时访问不可信站点,关闭窗口后…

    2026年10月3日 • 用户投稿
    200
  • 苹果手机怎么删除浏览过的页面

    苹果手机怎么删除浏览过的页面苹果手机怎么删除浏览过的页面苹果手机怎么删除浏览过的页面苹果手机怎么删除浏览过的页面

    可以通过以下五个步骤删除苹果手机浏览过的网页:打开 Safari 浏览器。点击右下角的“标签”图标。查看打开的标签。长按要删除的标签并点击“关闭”。点击“完成”以删除所有标签,或点击“选择”删除特定标签。 如何删除苹果手机浏览过的网页 第一步:打开 Safari 浏览器 在 iPhone 主屏幕上找…

    2026年10月3日 • 用户投稿
    300
  • 虚幻5类魂新作《地狱即我们》试玩Demo上线:探索半开放世界

    虚幻5类魂新作《地狱即我们》试玩Demo上线:探索半开放世界虚幻5类魂新作《地狱即我们》试玩Demo上线:探索半开放世界虚幻5类魂新作《地狱即我们》试玩Demo上线:探索半开放世界虚幻5类魂新作《地狱即我们》试玩Demo上线:探索半开放世界

    虚幻5引擎打造的类魂新作《hell is us》试玩demo现已开放下载,玩家可在steam、epic、ps5以及xbox series x|s平台免费体验,活动截止至8月28日。游戏预计于9月4日正式推出。 《地狱即我们》是一款第三人称动作冒险游戏,融合紧张刺激的近战格斗与深度探索元素。游戏构建了…

    2026年10月3日 • 用户投稿
    100
  • linux使用yum安装jdk的目录在哪

    linux使用yum安装jdk的目录在哪linux使用yum安装jdk的目录在哪linux使用yum安装jdk的目录在哪linux使用yum安装jdk的目录在哪

    linux使用yum命令安装JDK时,安装目录是由操作系统包管理器决定的,查找步骤为:1、打开终端;2、运行“rpm -ql”命令,将显示JDK安装的所有文件和目录列表,其中包括安装路径。 本教程操作系统:Linux5.18.14系统、Dell G3电脑。 在使用yum命令安装JDK时,安装目录是由…

    2026年10月3日 • 用户投稿
    000
  • yii框架适合做什么项目?

    yii框架适合做什么项目?yii框架适合做什么项目?yii框架适合做什么项目?yii框架适合做什么项目?

    Yii是一个基于组件的高性能PHP框架,用于开发大型Web应用。Yii采用严格的OOP编写,并有着完善的库引用以及全面的教程。从 MVC,DAO/ActiveRecord,widgets,caching,等级式RBAC,Web服务,到主题化,I18N和L10N,Yii提供了今日Web 2.0应用开发…

    2026年10月3日 • 用户投稿
    000
  • Sublime如何实现封装代码块快捷

    Sublime如何实现封装代码块快捷Sublime如何实现封装代码块快捷Sublime如何实现封装代码块快捷Sublime如何实现封装代码块快捷

    下面由sublime入门教程栏目给大家介绍sublime text实现封装代码块快捷的方法,希望对需要的朋友有所帮助! Sublime实现封装代码块快捷。 第一:复制要封装的代码块,比如下面代码。 第二:在工具中找到“新代码块”。 相关推荐:《sublime text》教程 文心快码 文心快码(Co…

    2026年10月3日 • 用户投稿
    100
  • 怎么用豆包AI帮我写自动化测试脚本 用AI快速生成Selenium/Puppeteer测试

    怎么用豆包AI帮我写自动化测试脚本 用AI快速生成Selenium/Puppeteer测试怎么用豆包AI帮我写自动化测试脚本 用AI快速生成Selenium/Puppeteer测试怎么用豆包AI帮我写自动化测试脚本 用AI快速生成Selenium/Puppeteer测试怎么用豆包AI帮我写自动化测试脚本 用AI快速生成Selenium/Puppeteer测试

    使用豆包ai写自动化测试脚本的关键在于明确需求并按步骤执行。1. 明确测试页面和功能,如测试登录流程;2. 告知使用的技术栈,如python+selenium或node.js+puppeteer;3. 提供具体操作步骤,包括输入内容、点击按钮及验证行为;4. 检查生成的代码是否需补充等待机制或处理干…

    2026年10月3日 • 用户投稿
    100
  • win10硬盘分区怎么合并_win10无损数据合并硬盘分区的操作指南

    win10硬盘分区怎么合并_win10无损数据合并硬盘分区的操作指南win10硬盘分区怎么合并_win10无损数据合并硬盘分区的操作指南win10硬盘分区怎么合并_win10无损数据合并硬盘分区的操作指南win10硬盘分区怎么合并_win10无损数据合并硬盘分区的操作指南

    可通过删除一个分区并将空间合并到相邻分区来优化存储,使用磁盘管理、DiskPart命令或第三方软件实现,操作前需备份数据以防丢失。 如果您发现Windows 10系统中的某个磁盘分区空间不足,而另一个分区却有大量闲置空间,可以通过合并分区的方式来优化存储布局。以下是实现这一目标的具体步骤: 本文运行…

    2026年10月3日 • 用户投稿
    000
  • 今日头条客户端如何调整推送频率_今日头条客户端通知频率的设置技巧

    今日头条客户端如何调整推送频率_今日头条客户端通知频率的设置技巧今日头条客户端如何调整推送频率_今日头条客户端通知频率的设置技巧今日头条客户端如何调整推送频率_今日头条客户端通知频率的设置技巧今日头条客户端如何调整推送频率_今日头条客户端通知频率的设置技巧

    首先在今日头条App内进入“我的”-“设置”-“通知设置”,可关闭特定内容提醒或开启免打扰模式;其次通过手机系统设置中的应用通知管理,彻底禁止或细分权限;最后调整首页兴趣标签,取消不关注类别以优化推送内容,减少无效通知。 如果您希望减少今日头条客户端的通知打扰,或想更有效地管理自己的信息接收节奏,可…

    2026年10月3日 • 用户投稿
    200
  • 钉钉首款 AI 硬件 DingTalk A1 开售

    钉钉首款 AI 硬件 DingTalk A1 开售钉钉首款 AI 硬件 DingTalk A1 开售钉钉首款 AI 硬件 DingTalk A1 开售钉钉首款 AI 硬件 DingTalk A1 开售

    9月15日,钉钉首款ai硬件dingtalk a1旗舰版正式在天猫钉钉官方旗舰店开售。 DingTalk A1旗舰版售价799元。购买产品的个人用户,将免费获得每月1000分钟语音转文字时长和10GB 个人云存储空间。也可以选择开通599元/年的专业版和1499元/年尊享版会员,享受更长语音转文字时…

    2026年10月3日 • 用户投稿
    000
  • 豆包AI如何设计界面 豆包AI界面设计技巧

    豆包AI如何设计界面 豆包AI界面设计技巧豆包AI如何设计界面 豆包AI界面设计技巧豆包AI如何设计界面 豆包AI界面设计技巧豆包AI如何设计界面 豆包AI界面设计技巧

    设计类似豆包ai的界面应重点关注四个方向。一、保持信息层级清晰,将核心功能如输入框、快捷按钮置于显眼位置,使用留白、边框或卡片式布局区分模块,主色调控制在2~3种以内;二、简化交互流程,统一输入输出形式,提供默认提示语,避免多层跳转;三、注重反馈与状态提示,添加加载动画、明确错误提示,结果展示分段落…

    2026年10月3日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信