哈希算法题目:无重复字符的最长子串
字数 1207 2025-10-25 22:15:07
哈希算法题目:无重复字符的最长子串
题目描述:
给定一个字符串 s,请你找出其中不含有重复字符的最长子串的长度。
示例:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
解题过程:
步骤1:理解问题核心
我们需要在字符串中找到最长的连续子串,该子串中的所有字符都是唯一的(不重复)。关键是要高效地检测重复字符并快速定位到新的起始位置。
步骤2:选择数据结构
使用哈希表(字典)来存储每个字符最近一次出现的索引位置。这样当我们遇到重复字符时,可以立即知道它上次出现的位置。
步骤3:滑动窗口思路
- 使用两个指针left和right来表示当前检查的子串范围(窗口)
- right指针向右移动,逐个检查字符
- 当遇到重复字符时,left指针跳转到该字符上次出现位置的下一个位置
- 同时维护一个变量记录最大长度
步骤4:详细执行过程
以s = "abcabcbb"为例:
初始化:
left = 0, max_len = 0
哈希表char_index = {}
遍历过程:
right=0, char='a'
- 'a'不在哈希表中,添加{'a':0}
- 当前长度=1,max_len=1
right=1, char='b'
- 'b'不在哈希表中,添加{'a':0, 'b':1}
- 当前长度=2,max_len=2
right=2, char='c'
- 'c'不在哈希表中,添加{'a':0, 'b':1, 'c':2}
- 当前长度=3,max_len=3
right=3, char='a'
- 'a'在哈希表中,上次出现在索引0
- left从0移动到max(0, 0+1)=1(避免left回退)
- 更新'a'的位置为3
- 当前长度=3-1+1=3,max_len保持3
right=4, char='b'
- 'b'在哈希表中,上次出现在索引1
- left从1移动到max(1, 1+1)=2
- 更新'b'的位置为4
- 当前长度=4-2+1=3
right=5, char='c'
- 'c'在哈希表中,上次出现在索引2
- left从2移动到max(2, 2+1)=3
- 更新'c'的位置为5
- 当前长度=5-3+1=3
right=6, char='b'
- 'b'在哈希表中,上次出现在索引4
- left从3移动到max(3, 4+1)=5
- 更新'b'的位置为6
- 当前长度=6-5+1=2
right=7, char='b'
- 'b'在哈希表中,上次出现在索引6
- left从5移动到max(5, 6+1)=7
- 更新'b'的位置为7
- 当前长度=7-7+1=1
最终得到最大长度3。
步骤5:算法总结
时间复杂度:O(n),每个字符只被访问一次
空间复杂度:O(min(m,n)),m为字符集大小,n为字符串长度
关键点:通过哈希表记录字符位置,实现O(1)时间的重复检测和快速指针跳转。