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

LeetCode 3. 无重复字符的最长子串解析

LeetCode 3. 无重复字符的最长子串解析

  • 1. 题目链接
  • 2. 问题分析
  • 3. 方法一:暴力法(不推荐)
    • 复杂度分析:
  • 4. 方法二:滑动窗口(推荐)
    • 复杂度分析:
  • 5. 方法三:优化的滑动窗口
    • 复杂度分析:
  • 6. 算法对比
  • 7. 关键点与技巧
  • 8. 总结

1. 题目链接

LeetCode 3. 无重复字符的最长子串解析

2. 问题分析

解决这个问题,我们需要找到一个字符串中不包含重复字符的最长子串的长度。关键在于处理字符串时,当遇到重复字符,如何高效地调整子串的起始位置。

3. 方法一:暴力法(不推荐)

最直观的方法是检查所有可能的子串,判断它们是否包含重复字符。

public int lengthOfLongestSubstringBruteForce(String s) {int n = s.length();int maxLength = 0;for (int i = 0; i < n; i++) {for (int j = i; j < n; j++) {if (isUnique(s, i, j)) {maxLength = Math.max(maxLength, j - i + 1);}}}return maxLength;
}private boolean isUnique(String s, int start, int end) {Set<Character> set = new HashSet<>();for (int i = start; i <= end; i++) {char c = s.charAt(i);if (set.contains(c)) {return false;}set.add(c);}return true;
}

复杂度分析:

时间复杂度:O(n³) - 三层嵌套循环(两层for循环,一层哈希集查找)

空间复杂度:O(min(n, m)) - 哈希集的大小

这种方法在LeetCode上会超时,不适合处理较长的字符串。

4. 方法二:滑动窗口(推荐)

滑动窗口算法可以有效地将时间复杂度降低到O(n)。基本思想是维护一个窗口,当遇到重复字符时,移动左边界。

class Solution {public int lengthOfLongestSubstring(String s) {int n = s.length();int l = 0;int r = 0;Set<Character> set = new HashSet<>();int res = 0;while (r < n) {if (set.contains(s.charAt(r))) {set.remove(s.charAt(l));l++;} else {set.add(s.charAt(r));r++;}res = Math.max(res, set.size());}return res;}
}

复杂度分析:

时间复杂度:O(n) - 每个字符最多被访问两次(左指针和右指针各一次)

空间复杂度:O(min(n, m)) - 哈希集的大小,其中m是字符集大小

5. 方法三:优化的滑动窗口

我们可以进一步优化,使用HashMap存储字符及其索引,这样当遇到重复字符时,可以直接跳转到正确的位置。

class Solution {public int lengthOfLongestSubstring(String s) {int n = s.length();int l = 0;int r = 0;Map<Character, Integer> map = new HashMap<>();int res = 0;while (r < n) {if (map.containsKey(s.charAt(r)) && l <= map.get(s.charAt(r))) {l = map.get(s.charAt(r)) + 1;}map.put(s.charAt(r), r);res = Math.max(res, r - l + 1);r++;}return res;}
}

复杂度分析:

时间复杂度:O(n) - 只需要遍历一次字符串

空间复杂度:O(min(n, m)) - HashMap的大小

6. 算法对比

在这里插入图片描述

7. 关键点与技巧

滑动窗口原理:维护一个不包含重复字符的窗口,动态调整窗口的左右边界。

哈希集合的使用:利用HashSet的O(1)查找时间来判断字符是否重复。

哈希映射的优化:通过存储字符索引,实现左指针的直接跳转,避免逐步移动。

边界条件处理:

  1. 空字符串输入

  2. 全相同字符的字符串

  3. 单个字符的字符串

复杂度权衡:在时间复杂度和空间复杂度之间做出合理选择,根据实际场景选择最合适的算法。

注意!!!

  1. r++ 之前 计算窗口长度 r - l + 1
  2. 滑动窗口边界,需要l <= map.get(s.charAt(r)) 而不是 <

8. 总结

解决"无重复字符的最长子串"问题的核心在于掌握滑动窗口技术。通过维护一个动态的窗口,我们可以在O(n)时间内高效解决问题。优化的关键在于利用合适的数据结构(HashSet或HashMap)来快速判断字符重复性,从而及时调整窗口大小。

这种滑动窗口的技巧不仅可以解决此题,还可以应用于很多其他子串、子数组问题中,是算法学习中一个非常重要的模式。

http://www.dtcms.com/a/537466.html

相关文章:

  • 给你一个新的网站怎么做2017网站备案抽查
  • 杭州网站做的好公司公司品牌网络推广方案
  • PyTorch Geometric 图神经网络实战利器
  • 《深入浅出统计学》学习笔记(一)
  • 从登录场景看通用序列化协议:JSON 与 Protobuf 实践
  • 天津网站优化软件一个公司可以做两个网站吗
  • 常用的网站开发做网站软件要钱吗
  • 怎样做一家网站傻瓜式建站软件下载
  • 【软考架构】案例题 - 数据库系统与缓存设计:在MySQL数据库设计中,反规范化的常见方法
  • 公司做网站都需要什么流程sofish wordpress主题
  • 顺德 网站开发 招聘网站排名软件推荐
  • 三维空间点绕Y轴旋转的数学原理与Python实现
  • 大模型未来发展可能有哪些趋势
  • 数电基础:TTL构成的常见门电路
  • 从0开始学python(day2)
  • 天蓝色网站网站建设遇到的问题及对策
  • 专业网站建设分类标准石家庄企业网络推广
  • MySQL Workbench 8.0.44中文汉化
  • 网站建设一条龙包括哪些服务wordpress主页在
  • 数据库锁分类和总结
  • 【优先级队列(堆)】数据流的中位数(hard)
  • 【openGauss】从“functions in index expression must be marked IMMUTABLE“谈起
  • 拼团购物网站怎么做学网站开发
  • 【CMake】使用 CMake 构建 C/C++ 项目的标准流程详解
  • 最短路径——BFS
  • git“约定式提交” (Conventional Commits) 的规范
  • 上海做家教网站有哪些wordpress导航菜单制作
  • 【FPGA】时序逻辑计数器设计仿真验证
  • 【Camunda】工作流
  • 泸州市建设职工培训中心网站怎么建立本地网站