字符串中无重复字符的最长子串

2021-08-15  本文已影响0人  peter_ffec

hot 100 meddium

1. 第3题 3. 无重复字符的最长子串

见原题:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

解题思路(双指针,滑动窗口)

过程:

  1. 用set来进行字符去重
  2. 类似动态规划要记录上一次比较的状态
    1. 从当前尾指针位置开始遍历字符串,如果set中一直没有进入set,尾指针后移动;记录当前的最大值max和头尾指针之间的元素个数比较大小
    2. 如果遇到set中有的字符,跳出这层循环,头指针往右移动一个位置,尾指针不变,set中去掉第一个内容,继续判断尾指针指向字符是不是在set中,返回1.1

代码:

        int left=0;
        int right=-1;
        int len=s.length();
        int max =0;
        Set<Character> charSets= new HashSet<>();
        for(left=0;left<len;left++){
            if(left!=0)
                charSets.remove(s.charAt(left-1));  //删除头指针指向的set中的值
            while(right+1<len && !charSets.contains(s.charAt(right+1))){
                charSets.add(s.charAt(right+1));
                right++;  //尾指针满足条件右移动
            }
            max=Math.max(max,right-left+1);  //此处遇到重复字符时,最大的子串长度
        }
        return max;

难度系数:四颗星

上一篇下一篇

猜你喜欢

热点阅读