无重复字符的最长子串

题目链接

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

题目要求

解题思路

这题最先想到的应该是双指针,用双指针遍历字符串,用哈希表记录字符是否重复,让 left 指向 不重复子串的最左端,right 指向最右端,求出 leftright - 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. 定义 leftright 指针
  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;
    }
}
相关推荐
智慧物业老杨17 小时前
物业数字化落地思考:真正的转型,是底层数据秩序的重构
java·大数据·人工智能·微服务·系统架构
星空20 小时前
金蝶苍穹build.gradle配置
java·build.gradle
步行cgn1 天前
Spring 基于 XML 的自动装配:byName 详解
java·后端·spring
大帅点兵1 天前
Apache Ant 1.9.9 完整讲解
java
LuTshoes1 天前
spring ai 实战 手搓 PlaneExecuteAgent
java·人工智能·spring·ai
这料鬼有毒1 天前
二刷hot100-73.矩阵置零
java
caoerzhong1 天前
JeeWMS 开源仓库管理系统二次开发与接口对接实战:Java WMS 如何与 ERP、MES 和自动化设备打通
java·开源
长谷深风1111 天前
评测AI Agent:三种裁判各司其职
java·大数据·开发语言·人工智能·ai agent
边境悍匪1 天前
蜗牛学苑 Java 智能体学习 Day42|项目周开发技术汇总 1 思维导图复盘
java·开发语言·spring boot·学习·spring
槑有烦恼1 天前
Java 字符串 & List集合 高频易错真题复盘(含全部错题+修正)
java