数据结构与算法——滑动窗口问题

在这里插入图片描述
思路:
1)建立一个HashSet 存无重复元素
2)设置窗口左索引 left 和 右索引 right
3)遍历字符串s,left 和 right 初值为0
4)遇到新char元素添加到 set 中
5)同时计算当前的最大窗口res = Math.max(res,r-l-1)
6)右索引逐步递增,直到遇到set集中已存在的元素:
删除set中从左窗口到现在重复元素之间的所有元素,从左索引开始
逐步remove, l++ 直到 重复元素被删除
删除后又将重复元素加入,实现了删除左侧元素
7) 全部遍历之后返回 结果res

代码实现
在这里插入图片描述

public int lengthOfLongestSubstring2(String s) {
        int res = 0;
        Set<Character> set = new HashSet<>();
        for(int l = 0, r = 0; r < s.length(); r++) {
            char c = s.charAt(r);
            while(set.contains(c)) {
                set.remove(s.charAt(l++));// "abcdefexyz";
            }
            set.add(c);
            System.out.println(set);
            res = Math.max(res, r - l + 1);
        }
        return res;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值