无重复字符的最长子串

题目链接

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

题目要求

解题思路

这题最先想到的应该是双指针,用双指针遍历字符串,用哈希表记录字符是否重复,让 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;
    }
}
相关推荐
2601_9621896018 分钟前
【SpringCloud】Gateway
java·spring cloud·gateway
夜郎king21 分钟前
基于Java的高德地图公交路线检索服务集成实践
java·智慧城市·高德地图api·县域交通智能化
Java小白笔记21 分钟前
Java中fixedDealy和fixedRate的区别是什么?
java·开发语言
@兽血沸腾25 分钟前
Thread线程和synchronized锁
java·开发语言
Android打工人29 分钟前
c++ 、java 融为一体2,c++ 实例化Android虚拟机直接运行java,c,java 一个进程号
android·java·c++
2601_9620566035 分钟前
Spring Boot——日志介绍和配置
java·数据库·spring boot
Alan CGH38 分钟前
一次非寻常的压测优化经历
java·网络·压力测试
2601_962066231 小时前
SpringBoot3 快速启动框架
java·spring boot·后端
远离UE41 小时前
UE5 shader instructions
java·开发语言