无重复字符的最长子串

题目链接

链接: 无重复字符的最长子串

题目要求

解题思路

这题最先想到的应该是双指针,用双指针遍历字符串,用哈希表记录字符是否重复,让 left 指向 不重复子串的最左端,right 指向最右端,求出 left 和 right - 1 之间的长度。遍历完字符串,返回最大的不重复字符串的长度。

为什么用滑动窗口?

这里举个例子:假设字符串是 d e a b c a b c a

让 right 下标去寻找不重复子串的末尾,当 right 找到重复字符停下,记录[left,right-1]区间的长度

此时如果让 left++ ,让后 right 回到 left 的位置,重新寻找不重复子串时:

会发现:如果让 right 回到 left,就意味着重新从 left 开始寻找不重复子串。这样会把之前已经检查过的字符重新检查一遍,而且可能得到更短的结果

因此用第一个 a前面的区间 作为起点时,最大长度最多就是:紫色括号的长度

这里就需要让 left 到重复字符的下一个(第一个 a 的后面),进行下一次最长子串的寻找

那么right 需要回到 left 的位置,重新寻找不重复子串吗?

答案是不需要的,因为此时区间[left right] 是没有重复字符的,right 向后继续寻找即可

因此,使用滑动窗口更契合本题。

怎么用滑动窗口

  1. 定义 left 和 right 指针
  2. 进窗口:把字符放进hash
  3. 遇到重复字符,出窗口:删除hash 的重复元素
  4. 更新无重复字符的最长子串的长度

代码实现

java 复制代码
class Solution {
    public static int lengthOfLongestSubstring(String s) {
        char[] arr = s.toCharArray();
        //哈希表的模拟
        int[] hash = new int[128]; //字符的范围 是 0 ~ 127 
        int len = 0;
        int left = 0,right = 0;
        while(right < arr.length){
            //记录字符出现的次数 入窗口
            hash[arr[right]]++;
            //有重符字符出现就出窗口
            while(hash[arr[right]] > 1){
                hash[arr[left++]]--;
            }
            //在无重复字符时更新记录
            len = Math.max(len, right - left + 1);
            right++;
        }
        return len;
    }
}
相关推荐
学长毕设6 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
zzu123zsw7 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
源码集结号8 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
论文复现现场9 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
啃瓜子的松鼠9 小时前
泛微OAe9-后端二开异步调用
java
秋天的怀念_David10 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
外收内放10 小时前
Python基础语法练习题(73)
java·前端·python
Wang's Blog10 小时前
Java 项目实战: 交友项目 - 环信后台发送消息测试
java·交友
用户37215742613510 小时前
Java 操作 Word 脚注和尾注:添加、读取与删除
java
小嘉丶学长11 小时前
Day14 · 字典与集合
java·开发语言·网络·python·学习·1024程序员节