哈希算法题目:最长不含重复字符的子字符串
字数 1042 2025-10-26 10:28:42
哈希算法题目:最长不含重复字符的子字符串
题目描述:给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。
解题过程:
- 问题分析
- 我们需要在字符串中找到一个连续的子串,该子串中的所有字符都是唯一的
- 要求返回这个最长无重复字符子串的长度
- 例如:"abcabcbb"的最长无重复子串是"abc",长度为3
- 哈希表解决方案思路
- 使用滑动窗口技术,维护一个窗口[left, right]
- 用哈希表记录每个字符最近出现的位置
- 当遇到重复字符时,移动左指针到重复字符的下一个位置
- 在遍历过程中记录最大窗口长度
- 详细步骤
步骤1:初始化变量
- 创建哈希表charIndex,键为字符,值为该字符最近出现的索引
- 左指针left = 0,最大长度maxLength = 0
步骤2:遍历字符串
- 对于每个位置right(从0开始),当前字符为s[right]
- 如果该字符已在哈希表中且其索引≥left,说明出现重复
- 将left移动到重复字符的下一个位置:left = charIndex[s[right]] + 1
步骤3:更新记录
- 更新当前字符的最新位置:charIndex[s[right]] = right
- 计算当前窗口长度:right - left + 1
- 更新最大长度:maxLength = max(maxLength, right - left + 1)
步骤4:示例演示
以"abcabcbb"为例:
- right=0: 'a'→left=0, maxLength=1
- right=1: 'b'→left=0, maxLength=2
- right=2: 'c'→left=0, maxLength=3
- right=3: 'a'重复,left=1→maxLength=3
- right=4: 'b'重复,left=2→maxLength=3
- right=5: 'c'重复,left=3→maxLength=3
- right=6: 'b'重复,left=5→maxLength=3
- right=7: 'b'重复,left=7→maxLength=3
- 代码实现要点
- 时间复杂度:O(n),每个字符只被访问一次
- 空间复杂度:O(min(m,n)),m为字符集大小
- 注意处理空字符串的情况
- 确保左指针只能向右移动,不能回退
- 优化考虑
- 可以使用数组代替哈希表,如果字符集较小(如ASCII)
- 数组大小设为128或256,索引直接对应字符的ASCII码
- 这样查找速度更快,代码更简洁