当前位置: 首页 > 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)来维护当前窗口。
  • 这种方式效率高,适用于大多数类似子串问题。

文章转载自:
http://bignonia.wsgyq.cn
http://cession.wsgyq.cn
http://centum.wsgyq.cn
http://chronicle.wsgyq.cn
http://blueish.wsgyq.cn
http://ala.wsgyq.cn
http://animosity.wsgyq.cn
http://alienable.wsgyq.cn
http://cantonize.wsgyq.cn
http://antinatalism.wsgyq.cn
http://banish.wsgyq.cn
http://chateau.wsgyq.cn
http://cattywampus.wsgyq.cn
http://christly.wsgyq.cn
http://brassiness.wsgyq.cn
http://bree.wsgyq.cn
http://afford.wsgyq.cn
http://choriambus.wsgyq.cn
http://beneficially.wsgyq.cn
http://aic.wsgyq.cn
http://arundinaceous.wsgyq.cn
http://atacama.wsgyq.cn
http://athwartship.wsgyq.cn
http://basswood.wsgyq.cn
http://aristotype.wsgyq.cn
http://bureaucratism.wsgyq.cn
http://balletic.wsgyq.cn
http://blastocoele.wsgyq.cn
http://capriote.wsgyq.cn
http://beggarly.wsgyq.cn
http://www.dtcms.com/a/200434.html

相关文章:

  • 算法(最小基因变化+迷宫中离入口最近的出口)
  • 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安装
  • HGDB中如何为表增加自增主键
  • InternLM 论文分类微调实践(XTuner 版)
  • docker安装Prometheus+Grafana
  • TeaType 奶茶性格占卜机开发记录:一场俏皮的 UniApp 单页奇遇
  • C++类与对象--4 友元
  • Linux利用多线程和线程同步实现一个简单的聊天服务器
  • stata入门学习笔记——导入数据
  • GPFS故障实际生产故障处理分析
  • Node.js聊天室开发:从零到上线的完整指南
  • 使用 Flask 框架实现FTP,允许用户通过 Web 界面浏览和下载文件夹中的所有文件