滑动窗口---- 无重复字符的最长子串

🔥个人主页: Milestone-里程碑

❄️个人专栏: <<力扣hot100>> <<C++>><<Linux>>

<<Git>><<MySQL>>

🌟心向往之行必能至

📝 题目描述

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

示例:

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

💡 解题思路:滑动窗口

这道题的核心需求是「找到无重复的最长子串」,而滑动窗口正是处理这类子串 / 子数组问题的利器。

核心思想

我们可以把字符串想象成一条直线,用两个指针 leftright 维护一个动态的「窗口」:

  • 右指针 right:负责向右扩展窗口,把新的字符加入窗口。
  • 左指针 left:当窗口内出现重复字符时,向右移动以缩小窗口,直到窗口内不再有重复。
  • 计数数组:用一个大小为 256 的数组记录每个字符在当前窗口中的出现次数,因为 ASCII 字符最多有 256 种。

这个过程就像一个滑动的窗口,右指针不断向右探索,左指针在必要时收紧,始终保证窗口内的字符是唯一的。


🧩 完整代码实现

cpp

复制代码
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        // 初始化数组,记录每个字符出现次数,初始值为0
        vector<int> v(256, 0);
        int left = 0, count = 0;
        
        // 右指针遍历整个字符串
        for (int right = 0; right < s.size(); right++) {
            // 当前字符加入窗口,计数+1
            v[s[right]]++;
            
            // 如果当前字符出现次数 > 1,说明窗口内有重复
            while (v[s[right]] > 1) {
                // 左指针右移,减少离开窗口的字符的计数
                v[s[left]]--;
                left++;
            }
            
            // 更新最长无重复子串的长度
            count = max(count, right - left + 1);
        }
        return count;
    }
};

⚙️ 复杂度分析

  • 时间复杂度:O (n)每个字符最多被右指针和左指针各访问一次,总操作次数是 2n,所以是线性时间。
  • 空间复杂度 :O (1)因为 vector 的大小固定为 256,是一个常数,不随输入字符串长度变化。

✅ 测试用例验证

我们用题目中的几个示例来验证一下代码的正确性:

  1. 输入"abcabcbb"窗口变化:aababcbcacababcbb最长长度为 3。

  2. 输入"bbbbb"窗口始终只能包含一个 b,最长长度为 1。

  3. 输入"pwwkew"窗口变化:ppwwwkwkekekew最长长度为 3。


🎯 总结

滑动窗口是一种非常高效的算法思想,尤其适合处理子串、子数组类的问题。这道题的关键在于:

  • 用两个指针动态维护窗口的边界。
  • 用数组快速判断字符是否重复。
  • 在每一步更新最长子串的长度。
相关推荐
Old Uncle Tom13 小时前
OpenClaw 记忆系统 -- 记忆预加载
java·数据结构·算法·agent
会编程的土豆13 小时前
洛谷题单入门1 顺序结构
数据结构·算法·golang
小小小米粒13 小时前
Collection单列集合、Map(Key - Value)双列集合,多继承实现。
java·开发语言·windows
生信碱移13 小时前
PACells:这个方法可以鉴定疾病/预后相关的重要细胞亚群,作者提供的代码流程可以学习起来了,甚至兼容转录组与 ATAC 两种数据类型!
人工智能·学习·算法·机器学习·数据挖掘·数据分析·r语言
蜡台13 小时前
Python包管理工具pip完全指南-----2
linux·windows·python
Mr.朱鹏13 小时前
【Python 进阶 | 第四篇】Psycopg3 + Flask 实现 PostgreSQL CRUD 全流程:从连接池到RESTful接口
python·postgresql·flask·virtualenv·fastapi·pip·tornado
智者知已应修善业13 小时前
【51单片机中的打飞机设计】2023-8-25
c++·经验分享·笔记·算法·51单片机
摇滚侠13 小时前
expdp 查看帮助
java·数据库·oracle
2401_8714928514 小时前
Vue.js监听器watch利用回调函数处理级联下拉框数据联动
jvm·数据库·python
FreakStudio14 小时前
亲测可用!可本地部署的 MicroPython 开源仿真器
python·单片机·嵌入式·面向对象·并行计算·电子diy·电子计算机