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

剑指offer-79、最⻓不含重复字符的

题目描述

请从字符串中找出⼀个最⻓的不包含重复字符的⼦字符串,计算该最⻓⼦字符串的⻓度。

数据范围: ⻓度⼩于40000

示例1
输⼊:"abcabcbb"
返回值:3
说明:因为⽆重复字符的最⻓⼦串是"abc",所以其⻓度为 3。

示例2
输⼊:"bbbbb"
返回值:1
说明:因为⽆重复字符的最⻓⼦串是"b",所以其⻓度为 1

示例3
输⼊:"pwwkew"
返回值:3
说明:因为⽆重复字符的最⻓⼦串是 "wke",所以其⻓度为 3。

思路及解答

暴力枚举

双层循环枚举所有子串,检查是否包含重复字符

java

public class Solution { public int lengthOfLongestSubstring(String s) { if (s == null || s.length() == 0) return 0; int n = s.length(); int maxLen = 0; // 枚举所有可能的子串起始位置 for (int i = 0; i < n; i++) { // 枚举所有可能的子串结束位置 for (int j = i; j < n; j++) { // 检查子串s[i..j]是否无重复 if (isUnique(s, i, j)) { maxLen = Math.max(maxLen, j - i + 1); } else { break; // 有重复,内层循环可提前结束 } } } return maxLen; } // 检查子串s[left..right]是否无重复字符 private boolean isUnique(String s, int left, int right) { Set<Character> set = new HashSet<>(); for (int i = left; i <= right; i++) { char c = s.charAt(i); if (set.contains(c)) { return false; } set.add(c); } return true; } }
  • 时间复杂度:O(n³),外层循环n次,内层循环最多n次,isUnique检查O(n)
  • 空间复杂度:O(min(n,128)),字符集大小有限

滑动窗口(基础版)

右指针扩展窗口,左指针收缩窗口以消除重复

窗口定义:

  • left:窗口左边界
  • right:窗口右边界
  • window:当前窗口内的字符集合

执行过程示例("abcabcbb"):

text

初始: left=0, right=0, window={}, maxLen=0 1. 添加'a': window={a}, right=1, maxLen=1 2. 添加'b': window={a,b}, right=2, maxLen=2 3. 添加'c': window={a,b,c}, right=3, maxLen=3 4. 添加'a'(重复): 移除s[0]='a', left=1 5. 添加'a': window={b,c,a}, right=4, maxLen=3 ... 结果: 3

java

import java.util.HashSet; import java.util.Set; public class Solution { public int lengthOfLongestSubstring(String s) { if (s == null || s.length() == 0) return 0; Set<Character> window = new HashSet<>(); int left = 0, right = 0; int maxLen = 0; int n = s.length(); while (right < n) { char c = s.charAt(right); // 如果当前字符不在窗口中,扩展窗口 if (!window.contains(c)) { window.add(c); right++; maxLen = Math.max(maxLen, right - left); } // 如果当前字符已在窗口中,收缩窗口 else { window.remove(s.charAt(left)); left++; } } return maxLen; } }
  • 时间复杂度:O(2n) = O(n),每个字符最多被访问两次
  • 空间复杂度:O(min(n,128)),字符集大小固定

优化滑动窗口

遇到重复字符时,左指针直接跳转到重复字符的下一个位置

java

import java.util.HashMap; import java.util.Map; public class Solution { public int lengthOfLongestSubstring(String s) { if (s == null || s.length() == 0) return 0; Map<Character, Integer> charIndex = new HashMap<>(); int left = 0, maxLen = 0; for (int right = 0; right < s.length(); right++) { char c = s.charAt(right); // 如果字符已存在且在当前窗口内 if (charIndex.containsKey(c) && charIndex.get(c) >= left) { // 左指针直接跳转到重复字符的下一个位置 left = charIndex.get(c) + 1; } // 更新字符的最后出现位置 charIndex.put(c, right); // 更新最大长度 maxLen = Math.max(maxLen, right - left + 1); } return maxLen; } }
  • 时间复杂度:O(n)
  • 空间复杂度:O(min(n,128))

进一步优化:使用数组替代HashMap

ASCII字符只有128个,可使用固定数组,即使用int[128]记录字符最后出现的位置,-1表示未出现

java

public class Solution { public int lengthOfLongestSubstring(String s) { if (s == null || s.length() == 0) return 0; int[] lastIndex = new int[128]; // ASCII字符集 Arrays.fill(lastIndex, -1); // 初始化为-1表示未出现 int left = 0, maxLen = 0; for (int right = 0; right < s.length(); right++) { char c = s.charAt(right); // 如果字符在当前窗口内出现过 if (lastIndex[c] >= left) { left = lastIndex[c] + 1; // 直接跳转 } // 更新字符的最后出现位置 lastIndex[c] = right; // 更新最大长度 maxLen = Math.max(maxLen, right - left + 1); }
http://www.jsqmd.com/news/1093210/

相关文章:

  • Codex Linux 教程:从安装配置到卸载清理全流程指南
  • 基于Anthropic-Cybersecurity-Skills构建网络安全AI智能体实战指南
  • FontForge字体设计完全指南:从入门到精通掌握专业字体编辑
  • GPT-5.6系列模型发布遇阻:OpenAI面临多国监管审批,Claude Fable 5重返引发全球讨论
  • Vibe Coding 实战复盘:一个人 + AI,从零打造会聊天的个人主页
  • 关于多线程归并排序的性能瓶颈与优化方案的技术7
  • HFSS求解设置实战解析:从驱动求解到本征模求解的核心配置
  • 数据中心电力模块的发展趋势对数据中心建设有哪些影响?
  • 目前自动评价系统问题---------会卡在一些异常的地方
  • XCP协议:从总线标定到汽车ECU数据交互的核心
  • GoChatIAI -Go语言AI应用服务平台(1)
  • 2026论文双降终极榜单:10款降AI率网站,查重降重+降AIGC一次通关
  • IntelliJ IDEA 之工程模块管理
  • Java的java.lang.foreign访问
  • Agent-Reach:命令行多模型AI对话与自动化集成工具实践指南
  • 2026新疆游首选指南:如何轻松甄别靠谱旅行社
  • 搭建Hermes+Obsidian,我搞定了这辈子最值的本地知识库,从安装到测试全流程讲解!你缺的不是好内容,是一个能帮你记住的AI
  • 全球高端健身房都在用什么跑步机?解析Precor必确的核心技术与产品优势
  • ARM Cortex-M内核单片机HardFault异常详解
  • 电路板质量出问题,怎么查源头?全流程追溯体系给出答案
  • 服务网格——让微服务“自动驾驶“的黑科技
  • 绘本培养孩子的表达力很有效
  • 实战!LangGraph Multi-Agent Supervisor 模式:手把手构建生产级多智能体系统
  • Playwright 自动化操控 X(Twitter) 发帖踩坑实录
  • 2026年适配维普降AI率软件横评:亲测8款工具,把AI率稳控在安全线内
  • SolidWorks_曲线与曲面设计19_曲面与实体混合建模
  • 2025轻松指南:零基础医疗会议转待办,包教包会避坑干货满满
  • ClickHouse:极速OLAP引擎解析
  • 3分钟快速上手:HS2-HF Patch终极安装与配置指南
  • 如何下载VirtualBox