剑指 Offer 48. 最长不含重复字符的子字符串

简介: 剑指 Offer 48. 最长不含重复字符的子字符串

 剑指 Offer 48. 最长不含重复字符的子字符串

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

示例 1:

输入: "abcabcbb"

输出: 3

解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。


示例 2:

输入: "bbbbb"

输出: 1

解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。


示例 3:

输入: "pwwkew"

输出: 3

解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。


请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。


提示:

  • s.length <= 40000

注意:本题与主站 3 题相同:力扣


思路:参考题解 力扣注释,利用滑动窗口(start、end可随时调整)

时间复杂度:优化前 O(N^2) → 优化后 O(N),空间换时间

空间复杂度:优化前 O(1) → 优化后 O(N),空间换时间

// 方法1-滑动窗口 利用map优化前:funclengthOfLongestSubstring(sstring) int {
// start:不含重复子串的起点;end:不含重复子串的终点;length:当前已匹配不重复子串长度;maxLength:目前已匹配最长子串长度start, end, length, maxLength, sLength :=0, 0, 0, 0, len(s)
forend<sLength {
cmpChar :=s[end]
// 过滤重复字符:将cmpChar与s[start:end]的字符逐个比较。比如abbbc,最终会跳过中间的bbbfori :=start; i<end; i++ {
ifs[i] ==cmpChar {
start=i+1// 若出现重复字符,start跳过重复字符,指向重复字符的下一位置length=end-start// 计算length时外循环中会对length++,所以这里暂时无需+1操作break// s[start:end]中已经存在相同字符,break退出进行下一轮外循环            }
        }
length++end++// 扩展右边界maxLength=max(maxLength, length)
    }
returnmaxLength}
// 方法2-滑动窗口 利用map优化后:funclengthOfLongestSubstring(sstring) int {
// start:不含重复子串的起点;end:不含重复子串的终点;length:当前已匹配不重复子串长度;maxLength:目前已匹配最长子串长度start, end, length, maxLength, sLength :=0, 0, 0, 0, len(s)
lastIndexMap :=make(map[byte]int) // 存储已遍历过的字符最后出现的下标位置forend<sLength {
cmpChar :=s[end]
// 仅当当前要遍历的 s[start,end) 中已存在 cmpChar = s[end] 时更新startiflastIndex, ok :=lastIndexMap[cmpChar]; ok&&lastIndex>=start {
start=lastIndex+1length=end-start        }
lastIndexMap[cmpChar] =endlength++end++// 扩展右边界maxLength=max(maxLength, length)
    }
returnmaxLength}
funcmax(a, bint) int {
ifa>b {
returna    }
returnb}

image.gif


目录
相关文章
|
人工智能 算法 程序员
【LeetCode】挑战100天 Day09(热题+面试经典150题)
【LeetCode】挑战100天 Day09(热题+面试经典150题)
235 0
|
11月前
Seata框架在AT模式下是如何保证数据一致性的?
通过以上这些机制的协同作用,Seata 在 AT 模式下能够有效地保证数据的一致性,确保分布式事务的可靠执行。你还可以进一步深入研究 Seata 的具体实现细节,以更好地理解其数据一致性保障的原理。
406 50
|
XML Java Android开发
14. 【Android教程】文本输入框 EditText
14. 【Android教程】文本输入框 EditText
1379 2
|
运维 监控 安全
基于 Serverless一键体验FastAPI
基于 Serverless Devs搭建FastAPI以及 Serverless Devs基础介绍
基于 Serverless一键体验FastAPI
|
JavaScript 数据可视化 开发工具
vue2项目 vue-cli脚手架的可视化创建以及命令行参数创建
vue2项目 vue-cli脚手架的可视化创建以及命令行参数创建
219 0
|
PHP 开发工具 git
如何将自己的扩展发布到Composer包仓库?具体步骤是怎样的?底层原理是什么?
如何将自己的扩展发布到Composer包仓库?具体步骤是怎样的?底层原理是什么?
392 0
|
SQL 分布式计算 资源调度
外部工具连接SaaS模式云数仓MaxCompute 实战—— 数据库管理工具篇
本次直播将主要分享MaxCompute查询加速功能、数据库管理工具DBeaver、DataGrip、SQL Workbench/J的部分连接演示。
1598 0
外部工具连接SaaS模式云数仓MaxCompute 实战—— 数据库管理工具篇
|
JSON 弹性计算 Linux
在ECS上学习使用Linux系统
通过在学习ECS,并在上面部署自己的博客,学习了Linux系统,感觉收获很大,下面正文内容记录了我在学习linux时的一些收获,更多内容欢迎访问我的博客 https://kingofdark.top/
228 0
|
移动开发 监控 网络协议
Nginx状态监控及日志分析
Nginx提供了一个内置的状态信息监控页面可用于监控Nginx的整体访问情况,这个功能由`ngx_http_stub_status_module`模块进行实现。日志的分析通过cat,awk等工具统计。
1194 0