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

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

//        给定一个字符串 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)来维护当前窗口。
  • 这种方式效率高,适用于大多数类似子串问题。

相关文章:

  • 算法(最小基因变化+迷宫中离入口最近的出口)
  • itop-3568开发板驱动开发指南-实验程序的编写
  • 【氮化镓】关态下负栅压对 p-GaN HEMTs 单粒子效应的影响
  • 433. 最小基因变化
  • PostGIS实现栅格数据导出图片标准格式【ST_AsGDALRaster】
  • JVM核心配置参数详解与调优指南
  • 《Head First 设计模式》第二章 - 笔记
  • go 与面向对象编程(OOP)
  • DTAS 3D多约束装配助力悬架公差分析尺寸链计算:麦弗逊/双叉臂/多连杆/H臂一网打尽
  • 机器学习第十七讲:PCA → 把100维数据压缩成3D视图仍保持主要特征
  • Ubuntu 20.04之Docker安装ES7.17.14和Kibana7.17.14
  • HarmonyOS Navigation组件深度解析与应用实践
  • 【强化学习】#6 n步自举法
  • 用户账号及权限管理:企业安全的基石与艺术
  • 工业自动化实践:机器人上料系统如何优化生产流程?
  • 对于程序员的个人理解
  • 软考教材重点内容 信息安全工程师 25章 移动安全 26章 大数据安全
  • C#学习9——接口、抽象类
  • 黄仁勋Computex演讲:将于三季度推出下一代GB300系统,个人AI计算机DGX Spark已全面投产
  • 【python】pyenv安装
  • 王毅同丹麦外交大臣会谈,表示在格陵兰问题充分尊重丹麦主权和领土完整
  • 研究显示:肺活量衰减始于20至25岁
  • 新华每日电讯:把纪律的螺丝拧得紧而又紧
  • 韦尔股份拟更名豪威集团:更全面体现公司产业布局,准确反映未来战略发展方向
  • 复旦兼职教授高纪凡首秀,勉励学子“看三十年才能看见使命”
  • 杨国荣︱以经验说事:思想史研究中一种需要反思的现象