力扣-无重复字符的最长子串
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.代码细节
1) set的泛型类型
Set<Character>set=new HashSet<>();
String类型取下标得到的是char类型,所以我们定义set的泛型应该是Character(注意不是char)。
2)加入set中
无论right元素是否在哈希表中,我们都应该把right下标的元素添加到哈希表中,因为即使right下标的元素存在于哈希表中,我们后续也会通过移动left指针至重复元素的下一位。
set.add(s.charAt(right));