无重复字符的最长子串算法解析

无重复字符的最长子串问题是一个经典的算法题,通常用于考察滑动窗口技术和哈希表的使用。以下是对该问题的详细解析和解答。

题目描述

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

示例

输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

解题思路

我们可以使用滑动窗口技术来解决这个问题。滑动窗口是一种动态调整窗口大小的技术,适用于处理子数组或子字符串的问题。

步骤

1. 初始化:

  • 使用两个指针 leftright 表示滑动窗口的左右边界。
  • 使用一个哈希表 map 来存储字符及其对应的索引。
  • 使用一个变量 maxLength 来记录最长无重复子串的长度。

2. 滑动窗口:

  • 遍历字符串,右指针 right 从左到右移动。
  • 如果当前字符已经在哈希表中存在,并且其索引在左指针 left 右边或重合,则更新左指针 left 到重复字符的下一个位置。
  • 将当前字符及其索引存入哈希表。
  • 更新最长无重复子串的长度。

3. 返回结果:

  • 返回 maxLength,即最长无重复子串的长度。

代码实现

以下是使用 JavaScript 实现的代码:

function lengthOfLongestSubstring(s) {
  const map = new Map();
  let left = 0;
  let maxLength = 0;

  for (let right = 0; right < s.length; right++) {
    if (map.has(s[right])) {
      left = Math.max(map.get(s[right]) + 1, left);
    }
    map.set(s[right], right);
    maxLength = Math.max(maxLength, right - left + 1);
  }

  return maxLength;
}

// 示例
console.log(lengthOfLongestSubstring("abcabcbb")); // 输出: 3

解释

1. 初始化:

  • map 用于存储字符及其对应的索引。
  • left 初始化为 0,表示滑动窗口的左边界。
  • maxLength 初始化为 0,表示最长无重复子串的长度。

2. 滑动窗口:

  • 遍历字符串,右指针 right 从左到右移动。
  • 如果当前字符 s[right] 已经在哈希表 map 中存在,并且其索引在左指针 left 右边或重合,则更新左指针 left 到重复字符的下一个位置。
  • 将当前字符及其索引存入哈希表 map
  • 更新 maxLength 为当前窗口的长度 right - left + 1maxLength 的较大值。

3. 返回结果:

  • 返回 maxLength,即最长无重复子串的长度。

时间复杂度和空间复杂度

  • 时间复杂度: O(n),其中 n 是字符串的长度。每个字符在哈希表中最多只会被插入和删除一次。
  • 空间复杂度: O(min(n, m)),其中 n 是字符串的长度,m 是字符集的大小。哈希表的大小取决于字符串中不同字符的数量。

通过这种方式,你可以高效地解决无重复字符的最长子串问题,并掌握滑动窗口技术和哈希表的使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值