力扣-无重复字符的最长子串

1.题目描述

2.题目链接

LCR 016. 无重复字符的最长子串 - 力扣(LeetCode)

3.题目解析

本题中我们还是使用滑动窗口来解决。

那么为什么使用滑动窗口来解决呢?

对于这样一个数组,我们定义双指针都指向数组第一个元素。left表示无重复字符的最长子串的起始位置,right遍历数组表示无重复字符的最长子串的结束位置。

对于这种需要去重的问题,我们通常的解法是定义1个HashSet,把left到right之间的元素都存入HashSet中,如果发现HashSet中已经包含了right下标的元素,就把left指针移动到重复元素的位置。 

同时,left也不必再从right下标开始遍历,直接从left+1位置开始遍历即可。

不断更新length,也就是取原始length和right-left+1的最小值,直到right遍历完数组,返回length即可。

我们分析问题发现,全部过程中,left和right双指针都无需回退,所以我们不使用普通双指针,而是使用滑动窗口。 

4.代码解答

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int left=0,right=0,length=0;
        Set<Character>set=new HashSet<>();
        for(;right<s.length();right++){
            if(!set.contains(s.charAt(right))){
            length=Math.max(length,right-left+1);
            }else{
                while(set.contains(s.charAt(right))){
                    set.remove(s.charAt(left));
                    left++;
                }
            }
              set.add(s.charAt(right));
             }
        return length;
    }
}

5.代码细节

1) set的泛型类型

 Set<Character>set=new HashSet<>();

String类型取下标得到的是char类型,所以我们定义set的泛型应该是Character(注意不是char)。

2)加入set中

无论right元素是否在哈希表中,我们都应该把right下标的元素添加到哈希表中,因为即使right下标的元素存在于哈希表中,我们后续也会通过移动left指针至重复元素的下一位。

 set.add(s.charAt(right));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值