哈希算法题目:最长不含重复字符的子字符串
字数 1042 2025-10-26 10:28:42

哈希算法题目:最长不含重复字符的子字符串

题目描述:给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。

解题过程:

  1. 问题分析
  • 我们需要在字符串中找到一个连续的子串,该子串中的所有字符都是唯一的
  • 要求返回这个最长无重复字符子串的长度
  • 例如:"abcabcbb"的最长无重复子串是"abc",长度为3
  1. 哈希表解决方案思路
  • 使用滑动窗口技术,维护一个窗口[left, right]
  • 用哈希表记录每个字符最近出现的位置
  • 当遇到重复字符时,移动左指针到重复字符的下一个位置
  • 在遍历过程中记录最大窗口长度
  1. 详细步骤
    步骤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
  1. 代码实现要点
  • 时间复杂度:O(n),每个字符只被访问一次
  • 空间复杂度:O(min(m,n)),m为字符集大小
  • 注意处理空字符串的情况
  • 确保左指针只能向右移动,不能回退
  1. 优化考虑
  • 可以使用数组代替哈希表,如果字符集较小(如ASCII)
  • 数组大小设为128或256,索引直接对应字符的ASCII码
  • 这样查找速度更快,代码更简洁
哈希算法题目:最长不含重复字符的子字符串 题目描述:给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。 解题过程: 问题分析 我们需要在字符串中找到一个连续的子串,该子串中的所有字符都是唯一的 要求返回这个最长无重复字符子串的长度 例如:"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码 这样查找速度更快,代码更简洁