649 字
3 分钟
无重复字符的最长子串

题目描述#

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

解题思路#

  1. 滑动窗口法
    • 使用双指针维护当前无重复子串的窗口
    • 右指针遍历字符串扩展窗口
    • 左指针在发现重复时收缩窗口
  2. 字符位置映射
    • 哈希表记录字符最后出现位置
    • 快速定位重复字符位置
  3. 窗口大小更新
    • 计算当前窗口长度 (right - left + 1)
    • 动态更新最大子串长度
  4. 边界处理
    • 左指针跳跃避免无效移动
    • 处理空串和单字符情况

关键洞察#

  1. 位置映射优化
    • 哈希表存储字符索引实现O(1)查找
    • 左指针直接跳转到重复字符后一位
  2. 线性时间复杂度
    • 左右指针各遍历一次字符串
    • 避免O(n²)的暴力解法
  3. 字符集无关性
    • 算法适用于ASCII和Unicode字符
    • 空间复杂度由字符种类决定
  4. 窗口动态维护
    • 始终保证窗口内无重复字符
    • 高效计算最大无重复区间

复杂度分析#

指标说明
时间复杂度O(n):每个字符被访问最多两次
空间复杂度O(k):k为字符集大小(ASCII为128)
最优情况O(n):当字符串无重复字符时

代码实现#

/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function (s) {
if (s.length === 0) return 0
let answer = 1;
const map = {};
let left = 0, right = 0;
while (left <= right && right < s.length ) {
const leftChar = s[left];
const rightChar = s[right];
if (!map[rightChar]) {
map[rightChar] = true;
answer = Math.max(answer, right - left + 1);
right++;
} else {
map[leftChar] = false;
left++;
}
}
return answer;
};

实际应用场景#

  1. DNA序列分析:寻找基因序列中最长无重复碱基片段`
  2. 密码强度检测:检测密码中最长连续无重复字符段`
  3. 数据压缩:在LZ77压缩中寻找最长无重复匹配串`
  4. 输入法优化:中文输入法候选词无重复筛选`

相似题目#

无重复字符的最长子串
https://website-truelovings-projects.vercel.app/posts/algorithms/无重复字符的最长子串/
作者
欢迎来到StarSky的网站!
发布于
2025-08-23
许可协议
CC BY-NC-SA 4.0