字符串中无重复字符的最长子串
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。
解题思路(双指针,滑动窗口)
过程:
- 用set来进行字符去重
- 类似动态规划要记录上一次比较的状态
- 从当前尾指针位置开始遍历字符串,如果set中一直没有进入set,尾指针后移动;记录当前的最大值max和头尾指针之间的元素个数比较大小
- 如果遇到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;
难度系数:四颗星