返回
HOT100——无重复字符的最长子串(JS实现)
前端
2023-09-21 21:14:38
无重复字符的最长子串
问题
给定一个字符串,找出其中不包含重复字符的最长子串的长度。
解题思路
本题采用双指针 + 哈希表的方式解决问题。
首先定义两个指针 left
和 right
,分别指向子串的左右端点。然后初始化一个哈希表 map
,用于存储每个字符最后一次出现的位置。
从左到右遍历字符串,每一步执行以下操作:
- 检查当前字符
s[right]
是否在哈希表map
中。 - 如果存在,更新
left
指针为map[s[right]] + 1
,排除重复字符。 - 更新哈希表
map[s[right]]
为right
。 - 计算子串长度
right - left + 1
并更新最大长度maxLen
。 - 将
right
指针右移一位。
当 right
指针移动到字符串的最后一个元素时,循环结束。
代码实现(JS)
/**
* 找出不包含重复字符的最长子串的长度
*
* @param {string} s 输入字符串
* @return {number} 最长子串长度
*/
const lengthOfLongestSubstring = (s) => {
// 初始化双指针和哈希表
let left = 0, right = 0;
const map = {};
// 最大长度
let maxLen = 0;
// 从左到右遍历字符串
while (right < s.length) {
// 检查当前字符是否在哈希表中
if (map[s[right]] !== undefined) {
// 如果存在,更新left指针
left = Math.max(left, map[s[right]] + 1);
}
// 更新哈希表
map[s[right]] = right;
// 计算子串长度并更新最大长度
maxLen = Math.max(maxLen, right - left + 1);
// 右指针右移一位
right++;
}
return maxLen;
};
示例
const s = "abcabcbb";
const result = lengthOfLongestSubstring(s); // 3
const s2 = "bbbbb";
const result2 = lengthOfLongestSubstring(s2); // 1
const s3 = "pwwkew";
const result3 = lengthOfLongestSubstring(s3); // 3
复杂度分析
- 时间复杂度:O(n),其中 n 为字符串的长度。
- 空间复杂度:O(min(n, m)),其中 m 为哈希表中元素的个数,最多为 n。