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

【算法】滑动窗口动态查找不含重复字符的最长子串

//        给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。
//
//        输入: s = "abcabcbb"
//        输出: 3String s = "abcabcbb";String[] sArr = s.split("");StringBuilder noDuplicateStr = new StringBuilder();for (int i = 0; i < sArr.length; i++) {for (int j = i + 1; j < sArr.length; j++) {if (sArr[i].equals(sArr[j])) {continue;}if (noDuplicateStr.toString().contains(sArr[j])) {continue;}noDuplicateStr.append(sArr[i]).append(sArr[j]);}}System.out.println(noDuplicateStr.toString().length());

以上实现逻辑存在题,无法正确找到 不含有重复字符的最长子串 的长度。你能指出存在哪些问题吗?


❌ 当前代码存在的问题:

  1. noDuplicateStr 是通过拼接字符的方式构造的,但这种方式不能保证字符顺序和连续性。
  2. 双重循环的逻辑错误,导致重复字符无法正确判断。
  3. 使用 StringBuilder.contains() 方法并不能准确追踪无重复字符的子串。
  4. 最终输出的 length() 并不是“最长无重复子串”的长度,而是 noDuplicateStr 的长度,这与题目要求不符。

✅ 正确解法(滑动窗口算法):

这是一个经典的 滑动窗口(Sliding Window) 问题,可以通过维护一个窗口来动态查找不含重复字符的最长子串。

public class Solution {public static int lengthOfLongestSubstring(String s) {int n = s.length();int maxLength = 0;int left = 0;HashMap<Character, Integer> charIndexMap = new HashMap<>();for (int right = 0; right < n; right++) {char currentChar = s.charAt(right);// 如果字符已出现且在窗口内,则移动左指针到该字符上次出现位置的右边if (charIndexMap.containsKey(currentChar) && charIndexMap.get(currentChar) >= left) {left = charIndexMap.get(currentChar) + 1;}// 更新当前字符的位置charIndexMap.put(currentChar, right);// 计算当前窗口长度并更新最大值maxLength = Math.max(maxLength, right - left + 1);}return maxLength;}public static void main(String[] args) {String s = "abcabcbb";System.out.println(lengthOfLongestSubstring(s)); // 输出: 3}
}

🔍 示例说明:

对于输入 s = "abcabcbb",最长无重复字符的子串是 "abc",其长度为 3


🧠 算法复杂度分析:

  • 时间复杂度:O(n),其中 n 是字符串长度,每个字符最多被访问一次。
  • 空间复杂度:O(min(m, n))m 是字符集大小(如 ASCII 字符集为 128)。

💡 建议:

  • 使用 HashMap 来记录字符最后一次出现的位置。
  • 使用双指针(leftright)来维护当前窗口。
  • 这种方式效率高,适用于大多数类似子串问题。
http://www.lryc.cn/news/2380294.html

相关文章:

  • 高速光耦在通信行业的应用(五) | 5Mbps通信光耦的特性
  • Apidog MCP服务器,连接API规范和AI编码助手的桥梁
  • 视觉模型部署实践:低算力平台RV1106上高效部署paddlepaddle 的PicoDet目标检测模型的技术实践
  • 07、基础入门-SpringBoot-自动配置特性
  • 国内MCP服务平台推荐 AIbase推出MCP服务器客户端商店
  • Profinet转Ethernet IP主站网关:点燃氢醌生产线的智慧之光!
  • Elasticsearch 初步认识
  • 爬虫攻防战:从入门到放弃的完整对抗史与实战解决方案
  • 可变参数(Variadic Functions)- 《Go语言实战指南》
  • [ctfshow web入门] web75
  • 交流学习 | 江西同为科技有限公司赴海尔总部考察交流
  • React方向:react的基本语法-数据渲染
  • Java求职面试:从核心技术到大数据与AI的场景应用
  • Ubuntu 20.04之Docker安装ES7.17.14和Kibana7.17.14
  • RK3568-鸿蒙5.1镜像烧录与调试
  • 游戏引擎学习第294天:增加手套
  • C# Try Catch Finally 执行顺序是什么?有返回值呢?
  • 水库雨水情测报与安全监测系统解决方案
  • 架构选择/区别
  • 嵌入式学习笔记 - STM32 ADC 模块工作模式总结
  • Python爬虫实战:获取taobao网最新rtx5060ti显卡销量数据并分析,为消费者做参考
  • IPLOOK | 2025 MVNOs 世界大会:从Wi-Fi通话到卫星覆盖
  • 零基础搭建!基于PP-ShiTuV2的轻量级图像识别系统(Docker+API部署指南)
  • 【C语言】贪吃蛇小游戏
  • Linux的日志管理
  • 大语言模型 07 - 从0开始训练GPT 0.25B参数量 - MiniMind 实机训练 预训练 监督微调
  • [免费]苍穹微信小程序外卖点餐系统修改版(跑腿点餐系统)(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
  • 【RAG】RAG-MCP:基于检索增强生成来缓解大语言模型工具选择中的提示膨胀问题
  • 甘特图工具怎么选?免费/付费项目管理工具对比测评(2025最新版)
  • UI自动化测试中,一个完整的断言应所需要考虑的问题