无重复字符的最长子串

题目链接

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

题目要求

解题思路

这题最先想到的应该是双指针,用双指针遍历字符串,用哈希表记录字符是否重复,让 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;
    }
}
相关推荐
Sarvartha4 小时前
final 关键字
java·开发语言
2601_952047794 小时前
单一策略深度教程:用轻易云把集成任务的报错实时推送到钉钉机器人
java·机器人·钉钉
数据狐(Datafox)5 小时前
淘宝图片搜索 API 落地实战:基于以图搜货搭建跨境电商选品系统
java·大数据·微服务
Escalating_xu6 小时前
【C 语言】数据在内存中的存储:补码、大小端、整型陷阱与 IEEE 754 全解析
java·c语言·网络
灯澜忆梦7 小时前
【面向对象编程C++】| 基础语法
java·c++·算法
一个风轻云淡7 小时前
GCC 和 GDB命令简单解读
java·linux·前端
省钱兄--zs7 小时前
西安24小时自助健身房解决方案实战:系统开发与部署全流程指南
java·spring boot·系统架构·intellij-idea·需求分析
资料库017 小时前
Linux 8个常见运维故障排查
java·linux·运维