无重复字符的最长子串问题是一个经典的算法题,通常用于考察滑动窗口技术和哈希表的使用。以下是对该问题的详细解析和解答。
题目描述
给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。
示例
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
解题思路
我们可以使用滑动窗口技术来解决这个问题。滑动窗口是一种动态调整窗口大小的技术,适用于处理子数组或子字符串的问题。
步骤
1. 初始化:
- 使用两个指针
left和right表示滑动窗口的左右边界。 - 使用一个哈希表
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 + 1和maxLength的较大值。
3. 返回结果:
- 返回
maxLength,即最长无重复子串的长度。
时间复杂度和空间复杂度
- 时间复杂度: O(n),其中 n 是字符串的长度。每个字符在哈希表中最多只会被插入和删除一次。
- 空间复杂度: O(min(n, m)),其中 n 是字符串的长度,m 是字符集的大小。哈希表的大小取决于字符串中不同字符的数量。
7298

被折叠的 条评论
为什么被折叠?



