哈希算法题目:无重复字符的最长子串
字数 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)时间的重复检测和快速指针跳转。

哈希算法题目:无重复字符的最长子串 题目描述: 给定一个字符串 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)时间的重复检测和快速指针跳转。